diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 035fac3..73bd134 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -178,7 +178,7 @@ {"id":"oracle-ajm2.23","title":"Make is_synthetic_alias delimiter-aware so a single-quoted body validates only as 'sx_'","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/plsql-accretion/src/tokscrub.rs:203 — verdict=defense-in-depth, severity=low\n**Impact:** In the G8 re-scan backstop (gate.rs::residue_check), an un-scrubbed estate STRING literal whose body is exactly '7', '7.0', 'id_', or 'sx_' passes the I-PRIVACY residue gate as if it were a clean synthetic, so those low-entropy original bytes can survive into a persisted/accepted fixture without being flagged — a fail-open hole in a guard advertised as fail-closed. High-entropy secrets (card numbers, salaries, SSNs) are still correctly rejected, and on the normal build path the upstream scrub rewrites every string literal to 'sx_' before the check runs, so no end-to-end leak is demonstrated under normal operation.\n**Evidence:** tokscrub.rs:200-213 (verbatim):\n pub fn is_synthetic_alias(text: &str) -> bool {\n let body = text.trim_matches('\\'').trim_matches('\"'); // <- strips BOTH quote kinds unconditionally\n if let Some(hex) = body.strip_prefix(\"id_\") { return hex.len()==12 && hex.bytes().all(|b| b.is_ascii_hexdigit()); }\n if let Some(hex) = body.strip_prefix(\"sx_\") { return hex.len()==8 && hex.bytes().all(|b| b.is_ascii_hexdigit()); }\n body == \"7\" || body == \"7.0\"\n }\nDocstring (184-189) says a '…'-delimited body should only validate as sx_ and a \"…\"-delimited body as id_; the code enforces neither (no delimiter is recorded). synthesise (167) confirms Class::Str can ONLY emit 'sx_'.\n\nBoth privacy layers import this one function on raw lexer token text with no quote-stripping at the call site:\n fixture.rs:543 if !is_synthetic_alias(text) (text = TokVerdict::Est\n**Repro:** Trigger (proven empirically above): a fixture/source string literal 'WHERE status = '\\''7'\\''' lexes to a StringLiteral whose verbatim text is '7'; token_verdicts emits EstateClass(\"'7'\"); is_synthetic_alias(\"'7'\") strips quotes to \"7\" and returns true, so gate.rs::residue_check passes it as clean despite synthesise() only ever emitting 'sx_' for a Class::Str. Same for '7.0', 'id_0123456789ab', 'sx_0123abcd'. Bound on impact: '4111111111111111' (and any body not matching id_/sx_/7/7.0) is rejected, so only those low-entropy shapes leak, and only when an un-scrubbed fixture reaches G8 (upstream structure_preserving_scrub normally rewrites all string literals first, so the b\n**Suggested fix:** Replace the blanket double trim_matches with delimiter-discriminated branches that tie each accepted shape to the delimiter synthesise() actually emits: a '…'-delimited body must match sx_ ONLY; a \"…\"-delimited body must match id_ ONLY; undelimited tokens may be id_ or the bare numerals 7 / 7.0. This rejects '7', '7.0', 'id_', and 'sx_'-as-string-content while still accepting every shape synthesise() produces. Note the existing positive-path unit tests pass bare bodies (gate.rs:1179 / fixture.rs:1018 / tokscrub.rs:485-489 use \"sx_0123abcd\" without quotes); a bare sx_ token cannot occur in practice because token_verdicts always carries the quotes for a StringLiteral, but to avoid breaking those tests either update them to the delimited forms ('sx_…', \"id_…\") or add an explicit undelimited sx_ branch — do NOT accept a single-quoted body as anything ot\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-06-02T07:41:10.178883861Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:13.571130566Z","closed_at":"2026-06-02T07:57:13.570852317Z","close_reason":"[done] implemented via parallel worktree workflow (commit 7450e1f63a), re-verified on main. Root-cause fix in crates/plsql-accretion/src/tokscrub.rs::is_synthetic_alias. Replaced the blanket double `trim_matches('\\'').trim_matches('\"')` with delimiter-discriminated branches: a single-quote-delimited body validates ONLY as 'sx_' (the sole Class::Str synthetic); a double-quote-delimited body ONLY as \"id_\"; undelimited tokens as id_ / 7 / 7.0, plus an explicit undelimited sx_ branch (dead on the production path since token_verdicts always carries the '...' for a StringLiteral) so the pre-existing bare-body unit tests (gate.rs:1179, fixture.rs:1018, tokscrub.rs:","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-02-r2","plsql-accretion"],"dependencies":[{"issue_id":"oracle-ajm2.23","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:10.178883861Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ajm2.3","title":"Add len<2 guard to recognise_datetime_literal to stop [1..0] slice panic on lone quote","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/plsql-ir/src/expr.rs:216 — verdict=keep, severity=high\n**Impact:** A malformed or parser-recovered expression fragment such as `v_d := DATE';` panics the analyzer at expr.rs:216 (\"begin > end (1 > 0) when slicing\"), aborting analysis of the entire compilation unit instead of degrading to Expr::Raw as the documented no-panic contract requires.\n**Evidence:** Cited code (crates/plsql-ir/src/expr.rs:194-220):\n 212 let trimmed = after.trim_start();\n 213 if !trimmed.starts_with('\\'') || !trimmed.ends_with('\\'') {\n 214 return None;\n 215 }\n 216 let body = &trimmed[1..trimmed.len() - 1];\nFor a lone `'`, starts_with('\\'') AND ends_with('\\'') both inspect the same single byte and are true, so line 213 does NOT early-return; line 216 computes &trimmed[1..0].\n\nSibling recognise_string_literal (line 164) DOES guard: `if !text.starts_with('\\'') || !text.ends_with('\\'') || text.len() < 2 { return None; }` — recognise_datetime_literal omits the equivalent len<2 guard.\n\nReal-crate test through public lower_expression entry, run via `CARGO_TARGET_DIR=$PWD/target cargo test -p plsql-ir`:\n thread '...dt_degenerate_does_not_panic' panicked at crates/plsql-ir/src/expr.rs:216:24:\n begin > end (1 > 0) when slicing `'`\n test result: FAILED. 0 passe\n**Repro:** Triggering input X -> wrong output Y: lower_expression(\"DATE'\") (or \"TIMESTAMP '\", \"INTERVAL '\", \"DATE '\") panics with \"begin > end (1 > 0) when slicing `'`\" at expr.rs:216 instead of returning an Expr. Trace: recognise_keyword_literal returns None (upper \"DATE'\" != NULL/TRUE/FALSE); recognise_string_literal returns None (text starts with 'D' not '\\''); recognise_datetime_literal matches keyword \"DATE\", after=\"'\", next_byte '\\'' is not alnum/_/$/# so no early return, trimmed=\"'\", line 213 passes both quote checks on the single byte, line 216 slices [1..0] -> panic. Contrast: lower_expression(\"DATE'2020-01-01'\") returns Expr::DateTimeLit fine.\n**Suggested fix:** Mirror recognise_string_literal's guard at line 213: change `if !trimmed.starts_with('\\'') || !trimmed.ends_with('\\'') {` to `if trimmed.len() < 2 || !trimmed.starts_with('\\'') || !trimmed.ends_with('\\'') {`. The len<2 check rejects the degenerate single-quote case before the slice, so lower_expression falls through to Expr::Raw as contracted. (len is byte length; both quotes are single-byte ASCII so the comparison is correct.) Add regression tests asserting lower_expression(\"DATE'\"), lower_expression(\"TIMESTAMP '\"), and lower_expression(\"INTERVAL '\") return non-panicking Expr variants.\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-06-02T07:41:07.179792429Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:08.950379732Z","closed_at":"2026-06-02T07:57:08.950144693Z","close_reason":"[done] implemented via parallel worktree workflow (commit a9ab5913d6), re-verified on main. Added `trimmed.len() < 2` guard to recognise_datetime_literal (expr.rs:213) mirroring recognise_string_literal. Root cause: for a lone `'`, starts_with('\\'') AND ends_with('\\'') both inspect the same single byte and are true, so the guard didn't early-return and &trimmed[1..0] panicked. With the guard, lower_expression(\"DATE'\") etc. fall through to a non-panicking Expr.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02-r2","keep","plsql-ir"],"dependencies":[{"issue_id":"oracle-ajm2.3","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.179792429Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ajm2.4","title":"Validate every param=value pair in is_allowed_alter_session, not just the first token (allowlist bypass)","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/oraclemcp-guard/src/enforcement.rs:64 — verdict=keep, severity=high\n**Impact:** An agent holding any session lease can smuggle non-allowlisted ALTER SESSION parameters (SQL_TRACE=TRUE, EVENTS='10046 ...', STATISTICS_LEVEL=ALL, etc.) past the documented content allowlist by prefixing one allowlisted parameter, enabling trace/diagnostic file generation (info disclosure) and session-context changes that the guard explicitly promises to reject.\n**Evidence:** enforcement.rs:58-66 — `pub fn is_allowed_alter_session(stmt: &str) -> bool { let upper = stmt.trim().to_ascii_uppercase(); let Some(rest) = upper.strip_prefix(\"ALTER SESSION SET \") else { return false; }; let param = rest.split(['=', ' ', '\\t']).next().unwrap_or(\"\").trim(); ALTER_SESSION_ALLOWLIST.contains(¶m) }` — only the FIRST token before any `=`/space is checked. Module/function doc (enforcement.rs:54-56) promises \"Anything outside the allowlist (e.g. statements that change security/audit context) is rejected.\" Sole-gate path confirmed: session_tool.rs:241 `if !is_allowed_alter_session(&statement) { return Err(...) }` then session_tool.rs:248 `apply_session_statement(...)`, and lease.rs:305-307 `pub fn apply_session_statement(...) { self.with_lease(&id.0, |lease| { lease.conn.execute(statement, &[])?; ... }) }` runs the raw statement verbatim, no re-parse. Standalone reproducti\n**Repro:** Triggering input X -> wrong output Y: is_allowed_alter_session(\"ALTER SESSION SET CURRENT_SCHEMA=HR SQL_TRACE=TRUE\") returns true (should be false) because split's .next() yields only \"CURRENT_SCHEMA\", which is allowlisted; the trailing SQL_TRACE=TRUE is never examined. Same for EVENTS='10046 ...'. Confirmed the gate is correct for the trailing param in isolation: is_allowed_alter_session(\"ALTER SESSION SET SQL_TRACE = TRUE\") returns false. Oracle accepts multiple space-separated param = value pairs in a single ALTER SESSION SET (documented syntax: ALTER SESSION SET param=value [param=value]...), so the smuggled statement executes verbatim at lease.rs:307 rather than erroring.\n**Suggested fix:** Replace the single-token check with a string-literal-aware parser that splits the post-prefix `rest` into successive `param = value` clauses, extracts the identifier immediately preceding each top-level `=`, and requires every one to be in ALTER_SESSION_ALLOWLIST. Fail closed: reject any statement that cannot be cleanly parsed into known param=value pairs, and reject if zero assignments are found (so values containing `=`/spaces inside quotes, e.g. EVENTS = '10046 ...', are not mis-parsed as parameter names). Add regression tests asserting ALTER SESSION SET CURRENT_SCHEMA=HR SQL_TRACE=TRUE and CURRENT_SCHEMA = HR EVENTS = '10046 ...' both return false, plus a positive multi-param case (CURRENT_SCHEMA = HR OPTIMIZER_MODE = ALL_ROWS) returning true.\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-06-02T07:41:07.308117402Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:10.314027919Z","closed_at":"2026-06-02T07:57:10.313800799Z","close_reason":"[done] implemented via parallel worktree workflow (commit fcb67103bb), re-verified on main. Root cause: enforcement.rs is_allowed_alter_session() only checked the FIRST token via `rest.split(['=',' ','\\t']).next()`, so `ALTER SESSION SET CURRENT_SCHEMA=HR SQL_TRACE=TRUE` (and ... EVENTS='10046 ...') passed because only CURRENT_SCHEMA was inspected. Fix: added a string-literal-aware top-level tokenizer (alter_session_params) that splits the post-prefix remainder into Word/Eq/Str tokens (single-quoted literals opaque, doubled-'' escapes honored, unterminated literal -> None), walks repeated `WORD = (WORD|STR)` clauses, collects the identifier before each top-level `=`, and requires EVE","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02-r2","keep","oraclemcp-guard"],"dependencies":[{"issue_id":"oracle-ajm2.4","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.308117402Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} -{"id":"oracle-ajm2.5","title":"Wire OAuth ScopeGrant into HTTP dispatch level gate or remove the enforced-control doc claim","description":"DEFERRED (2026-06-09): the target crates/oraclemcp-core/src/http.rs now lives in the PUBLISHED, external MuhDur/oraclemcp repo (E-4) — not editable here. Also gated: OAuth ScopeGrant->level-gate enforcement only matters for a write-capable, authenticated HTTP server; the shipped oraclemcp HTTP transport is read-only with no scope/level escalation. Implement in the oraclemcp repo when a write/auth HTTP server is built.","notes":"PASS 2026-06-02 (partial): Applied the directed MINIMAL CORRECTNESS fix (option b), not the full control. Verified via grep that ScopeGrant has NO reader anywhere (only def at http.rs:85, insert at http.rs:125, re-export at lib.rs:58) and apply_oauth_scopes is called only in scope.rs tests; server.rs:235 call_tool discards _context, so no scope->operating-level gate exists in the HTTP dispatch path. Rewrote the misleading 'enforced control' doc prose on ScopeGrant (http.rs:79-83) and the inline comment in oauth_guard (http.rs:122-123) to mark the grant as captured-but-NOT-yet-enforced, explicitly warning integrators tha","status":"deferred","priority":2,"issue_type":"bug","created_at":"2026-06-02T07:41:07.442746610Z","created_by":"durakovic","updated_at":"2026-06-09T07:29:33.903012212Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-02-r2","oraclemcp-core"],"dependencies":[{"issue_id":"oracle-ajm2.5","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.442746610Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ajm2.5","title":"Wire OAuth ScopeGrant into HTTP dispatch level gate or remove the enforced-control doc claim","description":"DEFERRED (2026-06-09): the target crates/oraclemcp-core/src/http.rs now lives in the PUBLISHED, external MuhDur/oraclemcp repo (E-4) — not editable here. Also gated: OAuth ScopeGrant->level-gate enforcement only matters for a write-capable, authenticated HTTP server; the shipped oraclemcp HTTP transport is read-only with no scope/level escalation. Implement in the oraclemcp repo when a write/auth HTTP server is built.","notes":"PASS 2026-06-02 (partial): Applied the directed MINIMAL CORRECTNESS fix (option b), not the full control. Verified via grep that ScopeGrant has NO reader anywhere (only def at http.rs:85, insert at http.rs:125, re-export at lib.rs:58) and apply_oauth_scopes is called only in scope.rs tests; server.rs:235 call_tool discards _context, so no scope->operating-level gate exists in the HTTP dispatch path. Rewrote the misleading 'enforced control' doc prose on ScopeGrant (http.rs:79-83) and the inline comment in oauth_guard (http.rs:122-123) to mark the grant as captured-but-NOT-yet-enforced, explicitly warning integrators tha","status":"deferred","priority":2,"issue_type":"bug","created_at":"2026-06-02T07:41:07.442746610Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:55.745878191Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-02-r2","oraclemcp-core"],"dependencies":[{"issue_id":"oracle-ajm2.5","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.442746610Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ajm2.5","depends_on_id":"oracle-plsql-converge-0lnu.11.7","type":"blocks","created_at":"2026-06-23T21:13:55.745342264Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ajm2.6","title":"Classify SELECT ... FOR UPDATE as Guarded/ReadWrite (inspect query.locks in Query arm)","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/oraclemcp-guard/src/classifier.rs:550 — verdict=keep, severity=medium\n**Impact:** A lock-taking, transaction-holding SELECT ... FOR UPDATE (including OF/NOWAIT/SKIP LOCKED) is classified Safe/ReadOnly, so on a permissive/READ_WRITE session it dispatches ungated with no step-up, and on a ReadOnly-mode schema policy it slips past the danger>=Guarded deny check (policy.rs:130) that a correctly-classified Guarded statement would hit.\n**Evidence:** classifier.rs:550-591 Statement::Query arm consults only user_defined_calls()/routine_purity() and statement_purity(); it never reads query.locks, so a UDF-free SELECT ... FOR UPDATE takes the stmt_pure branch -> DangerLevel::Safe / OperatingLevel::ReadOnly.\nlevels.rs:93 doc: DangerLevel::Guarded \"...MERGE, CTAS, `SELECT … FOR UPDATE`, COMMIT/ROLLBACK, EXPLAIN PLAN.\" — explicit contract violated.\nsqlparser 0.62 (Cargo.toml:16); query.rs:52 `pub locks: Vec` — signal is present in the AST, unused.\nStage A does not rescue it: PLSQL_SIDE_EFFECT_MARKERS (classifier.rs:119-129) contains no FOR UPDATE; default block_patterns empty; \"SELECT ... FOR UPDATE\" does not start with DECLARE/BEGIN/CREATE -> falls through to StageA::PureSql -> classify_statement.\nRuntime probe (cargo run --example, real Classifier::default().classify, then removed):\n SELECT * FROM t da\n**Repro:** Trigger X->Y: input `SELECT * FROM t FOR UPDATE` (any FOR UPDATE variant) -> classify() returns danger=Safe, required_level=Some(ReadOnly), identical to plain `SELECT * FROM t`. Correct output per levels.rs:93 is danger=Guarded, required=ReadWrite. The AST carries query.locks=[LockClause{lock_type:Update,..}] which the Query arm ignores. Verified by building and running a temporary example against the real crate (output above); example removed and `git diff crates/oraclemcp-guard/src/classifier.rs` confirms source unchanged from HEAD.\n**Suggested fix:** In the Statement::Query arm (classifier.rs ~550-591), before the stmt_pure decision add `let has_row_lock = !query.locks.is_empty();` and require `stmt_pure && !has_row_lock` for the Safe branch; otherwise fall to guarded_rw. This maps every SELECT ... FOR UPDATE (incl. OF/NOWAIT/SKIP LOCKED, all populating query.locks, and round-tripped via to_string() in the multi-statement split path) to Guarded/ReadWrite, matching levels.rs:93. Add an assertion test covering all five variants.\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-02T07:41:07.576408025Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:10.574174317Z","closed_at":"2026-06-02T07:57:10.573933547Z","close_reason":"[done] implemented via parallel worktree workflow (commit fcb67103bb), re-verified on main. Root cause: classifier.rs Statement::Query arm never inspected query.locks, so a UDF-free `SELECT ... FOR UPDATE` took the stmt_pure branch -> Safe/ReadOnly, contradicting levels.rs:93 (Guarded) and slipping past policy.rs:130 danger>=Guarded deny. Fix: `let has_row_lock = !query.locks.is_empty();` and require `stmt_pure && !has_row_lock`; FOR UPDATE / OF / NOWAIT / SKIP LOCKED all populate query.locks (and survive the to_string() round-trip in the multi-statement split path) -> Guarded/ReadWrite.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02-r2","keep","oraclemcp-guard"],"dependencies":[{"issue_id":"oracle-ajm2.6","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.576408025Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ajm2.7","title":"Make suppress.rs comment-start detection string/block-comment aware so `--` inside a literal cannot host a directive","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/plsql-sast/src/suppress.rs:131 — verdict=keep, severity=medium\n**Impact:** A reviewer or attacker who can get text into a scanned PL/SQL file can plant a suppression directive inside a string literal or block comment (e.g. v := '-- plsql-scan:ignore SEC001 '; or /* -- plsql-scan:ignore * */) that silences genuine SEC001/SEC006 security findings file-wide via the line-0 fallback — a fail-open in the suppression layer. Currently dormant: no production code calls apply_suppressions yet, so nothing triggers it in the shipped scan/SARIF/MCP pipeline today.\n**Evidence:** crates/plsql-sast/src/suppress.rs:121-136 index_source(): `let Some(mpos) = lower.find(MARKER) else { continue; }; ... let Some(cpos) = raw.find(\"--\") else { continue; }; if mpos < cpos { continue; }`. raw.find(\"--\") matches a `--` anywhere, including inside a single-quoted string or /* */ block comment.\n\nStandalone probe replicating the exact index_source/parse_rule_list/RuleSet logic (compiled with rustc -O):\n[REGISTERED] report payload 1 (glued ;) raw=\"v := '-- plsql-scan:ignore SEC001';\" mpos=Some(9) cpos=Some(6) -> matches(SEC001)=false all=false ids=[\"SEC001';\"]\n[REGISTERED] report payload 2 (glued ;) raw=\"v := '-- plsql-scan:ignore *';\" mpos=Some(9) cpos=Some(6) -> matches(SEC001)=false all=false ids=[\"*';\"]\n[REGISTERED] verifier payload A (trail sp) raw=\"v := '-- plsql-scan:ignore SEC001 ';\" mpos=Some(9) cpos=Some(6) -> matches(SEC001)=TRUE all=false\n[REGISTERED] verif\n**Repro:** Triggering input (file scanned via apply_suppressions with a SEC006 line-0 finding for the file): a single line `v := '-- plsql-scan:ignore * ';` (note trailing space before the closing quote) — or `/* -- plsql-scan:ignore SEC006 */`. For raw=\"v := '-- plsql-scan:ignore * ';\": mpos(marker)=9, cpos(first `--`)=6, so `mpos < cpos` is false and the line is registered as a real directive with all=true, suppressing every span-less finding in the file. Disproof of the report's specific payloads: `v := '-- plsql-scan:ignore SEC001';` does NOT suppress because parse_rule_list tokenizes the glued `';` into the rule id, producing \"SEC001';\" != \"SEC001\" (matches=false). The underlying guard defect is n\n**Suggested fix:** Replace the naive `raw.find(\"--\")` at line 131 with a single-quote-aware (and ideally /* */-aware) scan that returns the byte offset of the first `--` that begins a genuine Oracle line comment, skipping any `--` inside a single-quoted string literal (honoring the `''` escaped-quote convention) and inside block comments. Keep the existing `if mpos < cpos { continue; }` guard. Add regression tests for: (1) `--`-inside-string directive with a clean trailing token (`v := '-- plsql-scan:ignore SEC001 ';`) must NOT suppress, covering both the precise-line and the line-0 file-scoped fallback paths; (2) the wildcard in-string variant; (3) a block-comment carrier; (4) the legitimate directive-after-string case (`v := 'foo -- bar' || baz; -- plsql-scan:ignore SEC001`) must still suppress. Note: not live-exploitable today (no production caller of apply_suppressions), so fix this before wiring the s\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-02T07:41:07.722726142Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:11.463932069Z","closed_at":"2026-06-02T07:57:11.463693929Z","close_reason":"[done] implemented via parallel worktree workflow (commit df3dcfd601), re-verified on main. Root-cause fix in crates/plsql-sast/src/suppress.rs. index_source() previously located the Oracle line comment with raw.find(\"--\"), which matches a `--` anywhere on the line — including inside a single-quoted string literal or a /* */ block comment. With the line-0 file-scoped fallback (inline_reason_for), a marker buried in such a literal/comment could register a `plsql-scan:ignore` directive (e.g. `v := '-- plsql-scan:ignore * ';` with a trailing space parses a clean `*` token, or `/* -- plsql-scan:ignore SEC001 */`) and silence genuine SEC001/SEC006 findings file-wide — a fail-open. Replace","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02-r2","keep","plsql-sast"],"dependencies":[{"issue_id":"oracle-ajm2.7","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.722726142Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ajm2.8","title":"Replace zero-output assert! in compute_return_type with a typed emit diagnostic for degenerate functions","description":"Source: verify-and-hunt re-hunt + ground-truth calibration (2026-06-02, round 2).\n\n### crates/plsql-bindgen/src/emit.rs:549 — verdict=keep, severity=medium\n**Impact:** An operator (or upstream tool) feeding plsql-bindgen a serde-valid-but-degenerate plan — a function with return_type=null and no OUT/IN OUT params — crashes the codegen CLI with a panic/SIGABRT instead of the documented exit-1 typed failure, breaking the \"never panic on bad input\" contract and any CI gate that distinguishes parse/emit errors (exit 1) from crashes.\n**Evidence:** crates/plsql-bindgen/src/emit.rs:546-554:\n match parts.len() {\n 0 => {\n // Procedure with no OUT params.\n assert!(matches!(r.kind, RoutineKind::Procedure)); // line 549\n \"()\".to_string()\n }\nemit.rs:154 calls `let return_type = compute_return_type(r);` UNCONDITIONALLY, before the only guard (unsupported_type at emit.rs:159, which checks scalar marshalling, not kind/return-type consistency). emit_wrappers (emit.rs:53-68) performs no validation. main.rs:212 deserializes BindingPlan via plain serde_json::from_str with no validation; RoutineBinding.return_type is `Option` (lib.rs:69) with default derive.\n\nLive repro (debug): exit 101\n thread 'main' panicked at crates/plsql-bindgen/src/emit.rs:549:13: assertion failed: matches!(r.kind, RoutineKind::Procedure)\nLive repro (release, panic=\"abort\" at Cargo.toml:71): exit 134 (SIGABRT) — proving \n**Repro:** echo '{\"package_id\":\"hr.p\",\"package_name\":\"P\",\"routines\":[{\"name\":\"f\",\"kind\":\"function\",\"parameters\":[],\"return_type\":null,\"autonomous_transaction\":false}],\"diagnostics\":[]}' | ./target/debug/plsql-bindgen → exit 101, panic at emit.rs:549. Same input to ./target/release/plsql-bindgen → exit 134 (SIGABRT). Expected per contract: exit 1 with a typed BINDING_* error / emit-error message on stderr.\n**Suggested fix:** Do not assert on untrusted-input shape. Either (1) in the len==0 arm, when r.kind is Function, signal emit_routine to emit a typed-error body (mirroring the unsupported_type path at emit.rs:159-171, e.g. code \"BINDING_DEGENERATE_FUNCTION\") instead of asserting — keeping exit 0 with valid Rust + a bindgen diagnostic; or (2) add a validation pass over the deserialized BindingPlan in main.rs between serde_json::from_str (line 212) and emit_wrappers (line 228) that rejects a Function with return_type==None and no OUT/IN OUT params, returning ExitCode::from(1) with a stderr message — matching the documented exit-1 contract. Add a unit test feeding the degenerate function plan asserting non-panicking, contract-conformant output.\n\n## Acceptance criteria\n- [ ] Root-cause fix in production code; regression test fails before / passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; fmt only oraclemcp-*.\n- [ ] No regression on existing tests / adversarial corpus.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-02T07:41:07.857322130Z","created_by":"durakovic","updated_at":"2026-06-02T07:57:11.951876398Z","closed_at":"2026-06-02T07:57:11.951587939Z","close_reason":"[done] implemented via parallel worktree workflow (commit 9ac2e4992c), re-verified on main. Root cause: compute_return_type (emit.rs:549) asserted matches!(r.kind, RoutineKind::Procedure) on the parts.len()==0 arm. A function plan with return_type=null and no OUT/IN OUT params is untrusted-input-reachable because main.rs deserializes the BindingPlan via plain serde with no validation; it panicked (debug exit 101, release SIGABRT exit 134), breaking the never-panic contract. Fix (suggested option 1): added is_degenerate_function(r) in emit_routine that diverts such a routine to a typed-error body emitting code BINDING_DEGENERATE_FUNCTION (mirroring the unsupported_type path) before th","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02-r2","keep","plsql-bindgen"],"dependencies":[{"issue_id":"oracle-ajm2.8","depends_on_id":"oracle-ajm2","type":"parent-child","created_at":"2026-06-02T07:41:07.857322130Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} @@ -441,7 +441,7 @@ {"id":"oracle-ooyh","title":"PLSQL-OSS-AUDIT — plsql-store wire-protocol public structs missing field-level docs","description":"Building the workspace with RUSTFLAGS='-W missing_docs' shows the public API doc coverage is generally very good (most crates 0-3 undocumented items). The one notable cluster is crates/plsql-store/src/protocol.rs: ~70 missing-doc warnings, almost entirely on the public FIELDS of wire-protocol structs/enum variants.\n\nThe TYPES themselves are well documented (ProtocolVersion, DaemonRequest, DaemonResponse, ArtifactPayload, FactRow, CacheStats, DaemonError, DaemonEnvelope all have type-level /// docs). What is missing is field-level docs, e.g.:\n ProtocolVersion { major, minor, patch } -- fields undocumented\n ArtifactPayload { digest_hex, media_type } -- body IS documented, the other two are not\n FactRow { fact_id, kind, payload_json } -- fields undocumented\n CacheStats { blob_count, total_bytes, strategies } -- fields undocumented\n DaemonError { code, message } -- fields undocumented\n\nWhy it matters: protocol.rs defines the daemon's versioned WIRE PROTOCOL -- exactly the public surface an external integrator or doc reader most needs precise field semantics for. plsql-sast/src/lib.rs has a smaller version of the same gap (~11).\n\nSuggested fix: add /// docs to the public fields in plsql-store/src/protocol.rs (and the plsql-sast public items). Lowest priority of the audit batch -- it is polish, not correctness -- but worth a pass before a stable release given this is the wire contract. Optionally add '#![warn(missing_docs)]' to plsql-store/src/lib.rs to keep the coverage from regressing.","status":"closed","priority":4,"issue_type":"task","created_at":"2026-05-22T06:35:43.921600355Z","created_by":"durakovic","updated_at":"2026-05-23T08:56:17.518000290Z","closed_at":"2026-05-23T08:56:17.517680892Z","close_reason":"Added /// docs to every public field/struct/enum in crates/plsql-store/src/protocol.rs: ProtocolVersion + 3 fields, GetArtifact digest_hex, QueryFacts kind/limit, DaemonResponse Pong/Artifact/Facts/Stats/Error variants, ArtifactPayload digest_hex/media_type, FactRow 3 fields, CacheStats 3 fields, DaemonError 2 fields, DaemonEnvelope 2 fields, DaemonErrorCode enum, CodecError 3 variants. Verified zero missing-doc warnings in protocol.rs via RUSTFLAGS=-W missing_docs cargo build -p plsql-store. cargo test -p plsql-store: 27 pass; clippy -D warnings: clean. No behavior change.","source_repo":"oracle","compaction_level":0,"original_size":0} {"id":"oracle-orqe","title":"PLSQL-OSS-AUDIT3 — README.md still says 'per-tool tools/call execution wiring is still in progress' though round-2 fully wired all 34 MCP tools","description":"README.md:270-274 (overview section) and README.md:410-413 (Limitations section).\n\nTwo passages in the public-facing README still describe the MCP tools/call surface as in-progress:\n\n L270-274: 'The MCP server (plsql-mcp) is a single crate. It completes the MCP handshake and advertises the full tool surface over tools/list … per-tool tools/call execution is being wired in incrementally (see Limitations).'\n\n L410-413: 'The MCP server completes the protocol handshake and advertises every tool over tools/list; per-tool tools/call execution wiring is still in progress, so a live MCP client can discover the surface before every tool is individually callable over the wire.'\n\nThis was true before round-2 but is now false. oracle-l65d (PLSQL-OSS-WIRE) is closed; crates/plsql-mcp/src/dispatch.rs has 34 named dispatch arms, every advertised tool is either Ran (self-contained static tools) or RuntimeStateRequired (live-DB / graph / preview-session tools), validated by dispatch_table_matches_default_registry() + every_dispatch_table_entry_actually_dispatches() lockstep tests in mcp_protocol.rs:507 and dispatch.rs:347-376. The wire is wired.\n\nThe current README understates the shipped capability — visitors will read 'still in progress' and assume the server is half-built. For an OSS release where the README is the storefront, this is honesty rot in the deflationary direction (rare and arguably less harmful than over-promising, but still wrong).\n\nSuggested rewrite:\n L270-274: 'The MCP server (plsql-mcp) is a single crate. It completes the MCP handshake, advertises the full 34-tool surface over tools/list, and dispatches every tools/call to its real implementation: self-contained static-analysis tools run end-to-end, while live-DB / dep-graph / preview-session tools degrade to a typed RuntimeStateRequired response naming exactly which runtime state is missing — never a fake success.'\n\n L410-413: replace the 'wiring is still in progress' bullet with 'Live-DB MCP tools (query, patch_package, deploy_ddl, etc.) need the live-db feature and an active Oracle connection at runtime; without those they return a typed RuntimeStateRequired result rather than running.'","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-23T11:48:44.029305529Z","created_by":"durakovic","updated_at":"2026-05-23T11:51:22.763291710Z","closed_at":"2026-05-23T11:51:22.763002362Z","close_reason":"README rewritten to reflect that tools/call is fully wired (lockstep dispatch table + 36 tools + RuntimeStateRequired for live-DB-without-connection); Limitations reframed honestly as 'live-DB tools require a connection' instead of 'wiring in progress'.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0} {"id":"oracle-osg9","title":"PLSQL-LIN-013 — Document the lineage engine at `docs/components/lineage.md` (300+ lines) including the confidence model, all operation semantics, and example reports","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T12:46:39.086159333Z","closed_at":"2026-05-15T12:46:39.085401326Z","external_ref":"PLSQL-LIN-013","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:change-impact","component:lineage-engine","effort:M","layer:4","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-osg9","depends_on_id":"oracle-843o","type":"blocks","created_at":"2026-05-12T14:21:17.509093060Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} -{"id":"oracle-ot1i","title":"(optional/deferred) Publish the plsql-* crates to crates.io for 'cargo install plsql-mcp'","description":"HIGH-EFFORT, defer unless wanted: publishing the plsql-mcp binary to crates.io requires publishing all ~22 plsql-* dependency crates too (topological, rate-limited) + resolving plsql-* crates.io name availability + the vendored ANTLR-grammar attribution/licensing for public crates. The Docker+registry path (R1-R2) already delivers ~all the discoverability without this. Only do this if 'cargo install plsql-mcp' is specifically desired.","status":"deferred","priority":3,"issue_type":"task","created_at":"2026-06-09T07:21:57.236596123Z","created_by":"durakovic","updated_at":"2026-06-09T07:21:58.225002870Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ot1i","depends_on_id":"oracle-ck6k","type":"blocks","created_at":"2026-06-09T07:21:58.224487153Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ot1i","title":"(optional/deferred) Publish the plsql-* crates to crates.io for 'cargo install plsql-mcp'","description":"HIGH-EFFORT, defer unless wanted: publishing the plsql-mcp binary to crates.io requires publishing all ~22 plsql-* dependency crates too (topological, rate-limited) + resolving plsql-* crates.io name availability + the vendored ANTLR-grammar attribution/licensing for public crates. The Docker+registry path (R1-R2) already delivers ~all the discoverability without this. Only do this if 'cargo install plsql-mcp' is specifically desired.","status":"deferred","priority":3,"issue_type":"task","created_at":"2026-06-09T07:21:57.236596123Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:56.700876893Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ot1i","depends_on_id":"oracle-ck6k","type":"blocks","created_at":"2026-06-09T07:21:58.224487153Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ot1i","depends_on_id":"oracle-ublu.5","type":"blocks","created_at":"2026-06-23T21:13:56.700474025Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ouwf","title":"PLSQL-CAT-019 — Redesign live catalog loader inputs so schema filters are self-describing (not bare SchemaName wrappers)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-05-12T19:09:14.352799900Z","created_by":"durakovic","updated_at":"2026-05-12T19:34:30.462533103Z","closed_at":"2026-05-12T19:34:30.462250226Z","close_reason":"Implemented","source_repo":"oracle","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ouwf","depends_on_id":"oracle-m3b","type":"discovered-from","created_at":"2026-05-12T19:09:14.352799900Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ows6","title":"PLSQL-CICD-006 — Implement `gate ` with policy file (`.plsql-cicd-policy.toml`)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T14:46:13.287959598Z","closed_at":"2026-05-15T14:46:13.287672440Z","close_reason":"Shipped crates/plsql-cicd/src/gate.rs. run_gate applies 4 rule kinds against InvalidationPrediction (max_invalidations / blocked_kinds / min_confidence / blocking_unknown_reasons), aggregates ALL failures per run. parse_policy w/ deny_unknown_fields. Schema id plsql.cicd.gate_decision v1. 12 unit tests; plsql-cicd 28→40. /oracle: DATABASE-REFERENCE.md ALL_DEPENDENCIES + LOW-LEVEL-CATALOGS.md ALL_OBJECTS.OBJECT_TYPE.","external_ref":"PLSQL-CICD-006","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:change-impact","component:release-assurance","effort:M","layer:5","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-ows6","depends_on_id":"oracle-4k4o","type":"blocks","created_at":"2026-05-12T14:21:46.607709373Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-oxc","title":"PLSQL-PERF-002 — Add `plsql doctor memory` + `--memory-profile` output","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-16T07:24:23.244782716Z","closed_at":"2026-05-16T07:24:23.244489178Z","close_reason":"Implemented PLSQL-PERF-002 (commit ecfae13): MemoryProfile + engine_memory_profile/_envelope + 'plsql-engine doctor --memory', building on PERF-001 AnalysisRun::compact(). MemoryProfile = full_bytes vs compact_bytes (canonical-JSON byte length, deterministic/reproducible R10/R11 not live RSS), savings_bytes+savings_ratio (0.0 not NaN on empty run, is_finite asserted), per-section breakdown (catalog/dep_graph/parse_results bytes). Dedicated ENGINE_MEMORY_SCHEMA so consumers discriminate via matches_schema (consistent with the earlier code-review schema-discrimination fix #1). CLI 'doctor --memory' human + --robot-json, same pattern as --full; existing doctor/--full unchanged. 3 tests (compact-savings+per-section+deterministic; empty-run 0.0 finite ratio; 19 total engine); cargo clippy --no-deps -D warnings clean; CLI smoke verified (analyze->doctor --memory exit 0, full/compact bytes + per-section printed). Builds on PERF-001. My engine lane, collision-free. Cross-checked vs /oracle DATABASE-REFERENCE.md (analysis artifact footprint/memory posture).","external_ref":"PLSQL-PERF-002","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:analysis-engine","effort:M","layer:2-5","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-oxc","depends_on_id":"oracle-p5e","type":"blocks","created_at":"2026-05-12T14:18:34.679244495Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} @@ -452,6 +452,87 @@ {"id":"oracle-p8p","title":"PLSQL-PARSE-019 — Implement parse-quality metrics + corpus dashboard (clean rate, recovered rate, skipped-token ratio, top-level recognition)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T14:33:52.028264Z","closed_at":"2026-05-15T14:33:52.027992053Z","close_reason":"Added render_dashboard_markdown() to CorpusReport that emits a stable markdown dashboard with: Files scanned, top-level recognition rate (PARSE-019 'top-level recognition' metric), files recognized-empty count, recovered proxy (files_with_unknown / total — PARSE-019 'recovered rate' metric, currently proxy until ANTLR backend wires through ParseBackend), clean rate (success - recovered), total declarations + per-kind histogram. Plus a footer honestly noting that skipped-token ratio is 'not yet measurable' at the pre-parser layer (no token tape) and that recovered-rate is a proxy. Two new tests: corpus_dashboard_renders_markdown (validates header / metrics / kind histogram / honesty footer presence) and corpus_dashboard_clean_and_recovered_rates_are_well_defined (rates in [0,1], clean <= success). Visible via 'cargo test corpus_dashboard -- --nocapture'. Live snapshot: 18 files, 77.8% recognition rate, 0% Unknown proxy, 279 decls. 6 corpus tests pass; clippy --all-targets -D warnings clean. Cite: /oracle audit — DATABASE-REFERENCE.md (parser quality metrics) + LOW-LEVEL-CATALOGS.md (no direct entry; dashboard is parser-internal observability). Closes oracle-p8p.","external_ref":"PLSQL-PARSE-019","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:parser-core","effort:M","layer:1","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-p8p","depends_on_id":"oracle-wua","type":"blocks","created_at":"2026-05-12T14:11:09.387630362Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-pbsv","title":"PLSQL-MCP-PRO-004 — Implement commercial tools: `sarif_scan`, `orphan_candidates`, `explain_lifecycle`","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-16T05:45:07.898488305Z","closed_at":"2026-05-16T05:45:07.898216587Z","close_reason":"Implemented crates/plsql-mcp-pro/src/commercial_tools.rs (commit 14f3d42, FSL header): sarif_scan/orphan_candidates/explain_lifecycle = pure license gate + delegation. gate(&LicenseStatus) pure: Ok iff commercial else CommercialToolError::Unlicensed{reason} carrying foundation-fallback diagnostic verbatim (R13 degrade not panic/hard-error); *_with(license,..) pure variants + bare run_* resolve real env. run_sarif_scan->plsql_sast::to_sarif (SARIF 2.1.0); run_orphan_candidates->plsql_lineage::detect_orphans (zero-incoming report); run_explain_lifecycle->plsql_lineage::explain_node (missing node=>typed Query error never panic/empty). register_commercial_tools 3 Commercial descriptors idempotent. Added plsql-{sast,lineage,depgraph,output,mcp} deps. 6 tests (gate allow/block, each tool gated-then-delegates, missing-node typed Query, descriptor dedup/tier); full plsql-mcp-pro suite 18 pass; cargo clippy --no-deps -D warnings clean. Builds on MCP-PRO-002 + SAST-023/LIN-019. Cross-checked vs /oracle SECURITY-OPTIONS-REFERENCE.md (SARIF) + DATABASE-REFERENCE.md (dependency lifecycle/orphans).","external_ref":"PLSQL-MCP-PRO-004","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:mcp","component:mcp-foundation","effort:M","layer:3-plus","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-pbsv","depends_on_id":"oracle-5ktl","type":"blocks","created_at":"2026-05-12T14:20:46.908910172Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-pbsv","depends_on_id":"oracle-clj","type":"blocks","created_at":"2026-05-12T14:20:46.135079822Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-pbsv","depends_on_id":"oracle-duou","type":"blocks","created_at":"2026-05-12T14:20:47.645197029Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-pbsv","depends_on_id":"oracle-oe0f","type":"blocks","created_at":"2026-05-12T14:20:45.354106618Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-pi3","title":"PLSQL-DOC-012 — End-to-end test: generate docs for synthetic 30-package corpus; verify no broken links","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T18:15:04.039329953Z","closed_at":"2026-05-15T18:15:04.039060874Z","close_reason":"Added crates/plsql-doc/tests/e2e_corpus.rs end-to-end harness that walks corpus/synthetic/ + corpus/lab/ (excluding hero_diff/ which has intentional before/after object_id duplicates), extracts doc-comments via extract_doc_comments, builds a synthetic DocSet with object_id='..' identity, then renders the full HTML bundle and asserts: (1) >=30 documented objects (PARSE-012-style soft floor), (2) exactly one
per object — no duplicates from the renderer pipeline, (3) every internal link resolves to a data-object-id present in the bundle — broken-link gate, (4) doctor_report().objects_total matches DocSet length AND at least two kinds present (package_spec + package_body). corpus_root() walks up from CARGO_MANIFEST_DIR so the harness works from any cargo invocation point and degrades to a no-op on stripped checkouts. 4 new integration tests pass; current snapshot: 47 fixtures (~22 packages with spec+body). 76 plsql-doc tests + 4 e2e tests pass; clippy --all-targets -D warnings clean. Cite: plan.md §14 + /testing-conformance. Closes oracle-pi3.","external_ref":"PLSQL-DOC-012","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:documentation-generator","effort:M","layer:3","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-pi3","depends_on_id":"oracle-x8z","type":"blocks","created_at":"2026-05-12T14:52:50.519251112Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu","title":"PLSQL-CONVERGE-001 — Converge plsql-mcp onto the pure-Rust thin-native asupersync stack and ship the 0.5.0 superset","description":"MASTER PROGRAM EPIC. Source of truth distilled here — do NOT consult the plan doc. (Origin: docs/plans/2026-06-19-plsql-mcp-convergence-and-1.0-release.md v2.9.)\n\nGOAL: converge plsql-mcp onto the SHIPPED pure-Rust thin-native asupersync stack and ship a stable 0.5.0 superset.\n\nTRIO (verified 2026-06-23): rust-oracledb publishes `oracledb` 0.5.0 (pure-Rust thin driver; API-frozen 1.0-rc; nightly-only). oraclemcp publishes the engine-free spine 0.4.0 (-core/-db/-guard/-error/-audit); `oraclemcp-db` 0.4.0 is the CANONICAL async, cargo-public-api-snapshot-locked connectivity foundation (ADR-0006) whose docs name plsql-mcp as the convergence target. plsql-mcp is the SUPERSET (oraclemcp's DB tools + offline PL/SQL engine + USR loop + guarded writes); oraclemcp stays the lean tier.\n\nGATE \"oraclemcp-db 0.4.0 published\" = MET. We route live DB through oraclemcp-db -> insulated from oracledb directly (its API is confined to one lint-enforced file in oraclemcp-db).\n\nPHASES (children .7-.15 + Ship=oracle-ublu): 0 nightly-toolchain; A truth-up; B adopt-0.4.0-spine+asupersync-runtime+async-dispatcher (ONE ATOMIC UNIT — the 0.4.0 OracleMcpServer builds its runtime at construction, so the bump cannot compile without the async dispatcher); C driver-via-oraclemcp-db (thick->thin, catalog goes async/&Cx); D live-DB-runtime+wire-dispatch; E superset-surface+guarded-write-audit; F change-impact-CLI+Action; G fact-emission. X verification spans all. Ship=oracle-ublu.\n\nDAG: 0 -> B -> {C,D co-developed, joint gate = first live query through serve} -> E. A/F/G parallel (F/G need only 0). X gates on E/F/G. Ship gates on X.\n\nWORKFLOW NOTE: this br treats parent-child as a blocking edge — set a phase epic to in_progress to surface its child tasks as ready. CONSTRAINT: no new architecture beyond the convergence; toolchain is permanently nightly (asupersync). Track all work here; never edit .beads JSONL directly.","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.039229194Z","created_by":"durakovic","updated_at":"2026-06-25T07:45:49.303901156Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0} +{"id":"oracle-plsql-converge-0lnu.1","title":"Phase A — Hygiene, truth-up and release-readiness baseline","description":"Phase A. UNBLOCKED, start now. Scope: (1) Verify and close the converged stale-open verify-and-hunt epics oracle-ajm2, oracle-qm3q, oracle-qbqf (audit reports all children closed except deliberately-deferred defense-in-depth; confirm via br before closing). (2) Triage the deferred defense-in-depth bugs oracle-qm3q.8 (SideEffectOracle purity wire), oracle-ajm2.5 (OAuth ScopeGrant HTTP gate), oracle-qbqf.4 (cross-schema guard quoted-identifier): these live in oraclemcp-guard / oraclemcp-auth, which were REWRITTEN upstream in oraclemcp 0.3.0; check whether the 0.3.0 bump (Phase B) resolves them upstream and re-home or close accordingly. (3) Reconcile public-doc drift with code reality: README advertises a describe_object tool that is not registered on the wire (only describe_table/view/trigger/index handlers exist, unregistered); README headline says live Oracle DB tools while they are dispatch-gated stubs today; align all public docs with the honest dispatch-wired state. (4) Reactivate oracle-ublu (release epic) and write the release-readiness checklist (gate green, coverage_index floor, tag, ghcr, MCP registry). DoD: clean non-closed backlog, docs match code, release epic active, checklist written.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.079222312Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:24.782711791Z","closed_at":"2026-06-23T20:56:24.782408501Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.1","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.079222312Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10","title":"Phase C — Driver via oraclemcp-db (delete Instant Client; catalog goes async)","description":"ROLE: remove plsql-mcp's direct thick Oracle driver and route ALL live access through the shipped oraclemcp-db 0.4.0 (which wraps the pure-Rust thin oracledb 0.5.0). Co-developed sibling of Phase D.\nWHY: today plsql-catalog uses the thick ODPI-C `oracle` 0.6.3 crate (oracle-driver feature; needs Instant Client) for live catalog extraction. oraclemcp-db is the canonical thin foundation. The driver-free port already exists: plsql-catalog has its own sync `OracleConnection` trait + `load_snapshot_from_connection` consumed by ~30 `query_rows` loaders. S2 RESOLVED: oraclemcp-db 0.4.0's trait is async-only/&Cx with NO per-round-trip block_on escape (CI-forbidden) -> the catalog trait MUST go async/&Cx (a localized boundary block_on is foreclosed by the discipline). This is a real THICK->THIN driver swap, NOT a no-op (oraclemcp confirmed via its Codex finding C30).\nSCOPE (tasks): write ONE adapter impl of plsql_catalog::OracleConnection delegating to oraclemcp-db, PLACED IN plsql-mcp (NOT plsql-catalog — keep the offline engine free of the server deps); type/row-shape mapping (oraclemcp-db Vec<(String,OracleCell)> + caps vs catalog BTreeMap rows); convert the catalog trait + load_snapshot_from_connection + ~30 query_rows loaders to async/&Cx under async_trait(?Send); request UNCAPPED LOB reads for extraction (oraclemcp-db caps LOBs via SerializeOptions.max_lob_chars -> DBMS_METADATA.GET_DDL/ALL_SOURCE CLOBs would silently truncate and corrupt the snapshot); apply narrow_to_read_path on the read loaders; drop Instant Client from the Dockerfile; keep the thick oracle-driver/live-xe path COMPILABLE until the parity gate passes, then git rm. Adopt against the snapshot-locked api/oraclemcp-db.txt so breaks are caught.\nDEPS: Phase 0, Phase B. Co-developed with Phase D; JOINT ACCEPTANCE GATE = first live `query` round-trips through serve against Oracle 23ai.\nDoD: live catalog extraction works through oraclemcp-db; no odpic-sys/oracle 0.6.3 in Cargo.lock; Docker carries no Instant Client; large-CLOB parity (Phase X) green; thick path removed only after parity.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:25.766199174Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:26.666889987Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.766199174Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T20:56:26.550904290Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T20:56:26.666234287Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.1","title":"C.1 oraclemcp-db adapter impl (in plsql-mcp) + type/row mapping","description":"Write ONE adapter implementing plsql_catalog::OracleConnection by delegating to oraclemcp-db 0.4.0's async OracleConnection. PLACE IT IN plsql-mcp (NOT plsql-catalog — keep the offline engine free of oraclemcp-db/-guard/asupersync). Map the type/row shapes: oraclemcp-db rows are Vec<(String,OracleCell)> with SerializeOptions caps; plsql-catalog rows are BTreeMap; binds differ (catalog has a U64 variant). Adopt against the snapshot-locked api/oraclemcp-db.txt.\nACCEPTANCE: the adapter constructs an oraclemcp-db connection and runs a query, returning catalog-shaped rows; no oracledb:: or oraclemcp-db type leaks into plsql-catalog.\nDEPS: Phase B (the runtime + async dispatch must exist).","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:22.993994437Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.993994437Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.1","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:22.993994437Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.2","title":"C.2 Convert catalog OracleConnection trait + ~30 loaders to async/&Cx","description":"oraclemcp-db's trait is async-only/&Cx with NO per-round-trip block_on (S2 resolved -> thread &Cx). Convert plsql_catalog::OracleConnection + load_snapshot_from_connection + the ~30 query_rows loader sites to async/&Cx under async_trait(?Send). This is the bulk of Phase C. The &Cx comes from Phase D's per-request region.\nACCEPTANCE: catalog extraction is fully async; all ~30 loaders thread &Cx; no block_on in the catalog DB path.\nDEPS: C.1.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:23.132300936Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:27.408684050Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.2","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:23.132300936Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.2","depends_on_id":"oracle-plsql-converge-0lnu.10.1","type":"blocks","created_at":"2026-06-23T20:59:23.895297386Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.2","depends_on_id":"oracle-plsql-converge-0lnu.11.2","type":"blocks","created_at":"2026-06-23T20:59:27.407918042Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.3","title":"C.3 Request UNCAPPED LOB reads for catalog extraction","description":"oraclemcp-db caps LOBs via SerializeOptions.max_lob_chars/max_blob_bytes. Catalog extraction reads full CLOBs (DBMS_METADATA.GET_DDL, ALL_SOURCE) — capping would SILENTLY TRUNCATE DDL/source and corrupt the snapshot (and the depgraph/lineage built on it). Request uncapped LOB reads (set the caps high enough / use a non-capping path) for extraction queries.\nACCEPTANCE: a large (>cap) package's full DDL/source round-trips intact; verified by the large-CLOB parity test (Phase X).\nDEPS: C.1.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:23.290694972Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:24.050025489Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.3","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:23.290694972Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.3","depends_on_id":"oracle-plsql-converge-0lnu.10.1","type":"blocks","created_at":"2026-06-23T20:59:24.049251181Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.4","title":"C.4 Apply narrow_to_read_path on the catalog read loaders","description":"Apply oraclemcp-core's narrow_to_read_path / ReadPathCaps (from B.6) on the catalog-extraction/read loaders so the read path is capability-narrowed (cannot spawn/connect out / escalate). Defense-in-depth, consistent with oraclemcp's compile-time capability narrowing.\nACCEPTANCE: the read loaders run under ReadPathCaps; a test asserts a narrowed read path cannot perform a privileged effect.\nDEPS: C.2, B.6.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:59:23.427971883Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:24.350176064Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.4","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:23.427971883Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.4","depends_on_id":"oracle-plsql-converge-0lnu.10.2","type":"blocks","created_at":"2026-06-23T20:59:24.203313695Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.4","depends_on_id":"oracle-plsql-converge-0lnu.9.6","type":"blocks","created_at":"2026-06-23T20:59:24.349548956Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.5","title":"C.5 Drop Instant Client from the Dockerfile + README","description":"Once the adapter works, remove the Oracle Instant Client base/layer from the Dockerfile so the image is a single static binary with no native libs and no Oracle redistribution (matching oraclemcp). Update README to drop the bundles-Instant-Client language (coordinated with Phase A README honesty). NOTE: keep the JDK builder layer (Phase 0.3) for grammar codegen. Do not overpromise FROM-scratch/musl — match what the thin stack actually ships (oraclemcp's own image is oraclelinux:9, not scratch).\nACCEPTANCE: image builds with NO Instant Client; runs the server; README accurate.\nDEPS: C.1.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:59:23.570706982Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:24.507441581Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.5","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:23.570706982Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.5","depends_on_id":"oracle-plsql-converge-0lnu.10.1","type":"blocks","created_at":"2026-06-23T20:59:24.506736423Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.10.6","title":"C.6 Keep thick oracle-driver path compilable until parity, then git rm","description":"Migration safety: keep the thick `oracle` 0.6.3 (oracle-driver / live-xe) path COMPILABLE and green until the large-CLOB differential parity gate (Phase X) proves oraclemcp-db extraction == old thick output. Land on a long-lived branch with a revert posture. ONLY after parity is green, remove the thick `oracle` dep + the oracle-driver feature (git rm with RULE-1 sign-off for any file deletion).\nACCEPTANCE: thick path retired AFTER parity green; no odpic-sys / oracle 0.6.3 left in Cargo.lock; the boundary lint (Phase X) then enforces it.\nDEPS: C.1 (parity gate is Phase X).","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:59:23.720942295Z","created_by":"durakovic","updated_at":"2026-06-23T21:15:28.286443096Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.10.6","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"parent-child","created_at":"2026-06-23T20:59:23.720942295Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.6","depends_on_id":"oracle-plsql-converge-0lnu.10.1","type":"blocks","created_at":"2026-06-23T20:59:24.652988083Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.10.6","depends_on_id":"oracle-plsql-converge-0lnu.15.3","type":"blocks","created_at":"2026-06-23T21:15:28.285873609Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11","title":"Phase D — Live-DB runtime + wire connection into serve dispatch","description":"ROLE: make the advertised live-DB tools EXECUTE end-to-end. Co-developed sibling of Phase C.\nWHY: today every live-DB tool returns RuntimeStateRequired; `connect` only marks a profile active (not a real session); the protocol tells the agent to call `connect` but `connect` is itself gated -> a dead-end loop. There is NO live runtime to \"wire into\" — it must be BUILT. The async runtime itself was already stood up in Phase B; Phase D builds the stateful live-DB subsystem on top and threads it through dispatch.\nSCOPE (tasks): build the live-DB runtime (a connection registry holding a real oraclemcp-db connection, session/safety state, preview/approval registry); a per-request region that mints the &Cx each tool call needs; make `connect` create a REAL session; thread the runtime through handle_tools_call -> dispatch_tool; wire RequestBudget into the query timeout (cooperative cancellation; the win is cancellation + dropping block_on/Mutex, NOT request concurrency — stdio serve is sequential); fix the connect/recovery dead-end loop; land oracle-qbqf.4 (cross-schema guard Oracle-faithful on quoted-identifier case) WITH the live executor; home the plsql-mcp-side consumption of the upstream-fixed guard/auth (oracle-qm3q.8 / oracle-ajm2.5 become net-new superset work: bind a live side-effect oracle / write-auth surface).\nDEPS: Phase 0, Phase B. Co-developed with Phase C; JOINT ACCEPTANCE GATE = first live `query` round-trips through serve against Oracle 23ai (owned by the dedicated joint-gate bead, fed into Phase X).\nDoD: `connect` creates a real session; `query` after connect hits Oracle through serve; error-recovery no longer loops; RequestBudget cuts a slow query at the budget; qbqf.4 landed.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:25.866917082Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:26.923182772Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.866917082Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T20:56:26.784233582Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T20:56:26.922524102Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.1","title":"D.1 Build the live-DB runtime subsystem (registry/session/preview)","description":"There is NO live runtime to wire into — build it. A stateful live-DB runtime: a connection registry holding a real oraclemcp-db connection per active profile, session/safety state (operating level, lease), and a preview/approval registry for the guarded-write step-up tokens.\nACCEPTANCE: the runtime can hold a live connection + session state; unit-tested with a stub connection.\nDEPS: Phase B.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:24.772671152Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:24.772671152Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.1","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:24.772671152Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.2","title":"D.2 Per-request region mints &Cx + thread runtime through dispatch","description":"Open a per-tool-call asupersync request region that owns/mints the &Cx every live-DB path needs (the catalog async loaders in Phase C consume this &Cx). Thread the live-DB runtime + &Cx through handle_tools_call -> dispatch_tool to the live tool arms. Add cx.checkpoint() in long fetch loops.\nACCEPTANCE: a live tool call runs inside a region with a real &Cx; the catalog adapter (C) receives it.\nDEPS: D.1.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:24.920145490Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:25.721154317Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.2","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:24.920145490Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.2","depends_on_id":"oracle-plsql-converge-0lnu.11.1","type":"blocks","created_at":"2026-06-23T20:59:25.720504049Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.3","title":"D.3 connect creates a REAL session + fix the recovery dead-end loop","description":"Today `connect` only marks a profile active (not a session) and the protocol tells the agent to call `connect` while `connect` is itself RuntimeStateRequired-gated -> an infinite loop. Make `connect` open a real oraclemcp-db session into the registry (D.1); make `query` (and the other live arms) execute against it through the wire; break the recovery loop.\nACCEPTANCE: `connect` creates a real session; `query` after connect hits Oracle through serve; error-recovery no longer loops. (This is the heart of the C/D JOINT GATE.)\nDEPS: D.1, D.2.","status":"open","priority":0,"issue_type":"task","created_at":"2026-06-23T20:59:25.064917064Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:26.060183365Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.3","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:25.064917064Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.3","depends_on_id":"oracle-plsql-converge-0lnu.11.1","type":"blocks","created_at":"2026-06-23T20:59:25.880653548Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.3","depends_on_id":"oracle-plsql-converge-0lnu.11.2","type":"blocks","created_at":"2026-06-23T20:59:26.059519866Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.4","title":"D.4 Wire RequestBudget into the query timeout (cooperative cancellation)","description":"Apply oraclemcp-core's RequestBudget (from B.6) as the cooperative, cancel-aware timeout for live queries. The convergence win is cooperative cancellation + dropping block_on/Mutex (NOT request concurrency — stdio serve is sequential). A blocked round-trip must now be cancellable cleanly.\nACCEPTANCE: a slow query is cut at the budget; the session drains cleanly (no leaked session) — verified by the RequestBudget timeout test + LabRuntime cancel tests (Phase X).\nDEPS: D.3, B.6.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:59:25.221123822Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:26.390493209Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.4","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:25.221123822Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.4","depends_on_id":"oracle-plsql-converge-0lnu.11.3","type":"blocks","created_at":"2026-06-23T20:59:26.218648147Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.4","depends_on_id":"oracle-plsql-converge-0lnu.9.6","type":"blocks","created_at":"2026-06-23T20:59:26.389586051Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.5","title":"D.5 Land oracle-qbqf.4 cross-schema guard WITH the live executor","description":"oracle-qbqf.4 (deferred): make the cross-schema guard Oracle-faithful on quoted-identifier case (stop folding the parsed target). Its own note says \"land WITH the live executor wiring, NOT before\" — that wiring is now this phase. Implement it as part of the live execute_approved / cross_schema path.\nACCEPTANCE: a quoted-identifier cross-schema write is guarded Oracle-faithfully; oracle-qbqf.4 closed.\nDEPS: D.3.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:59:25.378548147Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:26.544747311Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.5","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:25.378548147Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.5","depends_on_id":"oracle-plsql-converge-0lnu.11.3","type":"blocks","created_at":"2026-06-23T20:59:26.543922012Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.6","title":"D.6a Bind the live SideEffectOracle into the guard classifier (resolves oracle-qm3q.8 downstream)","description":"oracle-qm3q.8 (SideEffectOracle::statement_purity trigger/VPD walk into the classifier SELECT/DML) was FIXED UPSTREAM in oraclemcp-guard 0.4.0, but it only FIRES when the superset binds a live SideEffectOracle (it needs live catalog/trigger/VPD facts). Binding that live oracle into the guard classifier is net-new plsql-mcp work and lands here.\nSCOPE DECISION (FOUNDER, decide BEFORE starting): in 0.5.0, or explicitly deferred-with-reason. Do NOT leave this open mid-implementation.\nACCEPTANCE: the live SideEffectOracle is bound so the 0.4.0 classifier purity check engages on SELECT/DML; oracle-qm3q.8 resolved or explicitly deferred.\nDEPS: D.3 (live session).","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:59:25.542437159Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.191489726Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.6","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T20:59:25.542437159Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.6","depends_on_id":"oracle-plsql-converge-0lnu.11.3","type":"blocks","created_at":"2026-06-23T20:59:26.707028854Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.11.7","title":"D.6b Bind the write-capable authenticated HTTP surface (resolves oracle-ajm2.5 downstream)","description":"oracle-ajm2.5 (OAuth ScopeGrant into the HTTP dispatch level gate) was FIXED UPSTREAM in oraclemcp-core/-auth 0.4.0, but it only engages when the superset exposes a write-capable, authenticated HTTP server (plsql-mcp can `serve --listen ADDR`). Binding the OAuth scope -> operating-level gate on that surface is net-new plsql-mcp work and lands here.\nSCOPE DECISION (FOUNDER, decide BEFORE starting): in 0.5.0, or explicitly deferred-with-reason.\nACCEPTANCE: OAuth scopes narrow the operating-level ceiling on the authenticated HTTP surface; oracle-ajm2.5 resolved or explicitly deferred.\nDEPS: D.3.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T21:13:55.270908182Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.292582404Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.11.7","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"parent-child","created_at":"2026-06-23T21:13:55.270908182Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.11.7","depends_on_id":"oracle-plsql-converge-0lnu.11.3","type":"blocks","created_at":"2026-06-23T21:13:55.457120721Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12","title":"Phase E — Superset surface polish + guarded-write audit","description":"ROLE: surface the superset's differentiated agent-UX and governance on the now-real live wire. Packaging existing capability — not new architecture.\nSCOPE (tasks): (idea 20) wire the agent-UX machinery that lives in the 0.4.0 oraclemcp-core onto the live wire — CapabilitiesReport, real per-tool inputSchemas, structured ErrorEnvelope + fuzzy did-you-mean, oracle:// resources, surface/profile gating, next-actions; (idea 21) identifier-case normalization (Oracle-faithful quoted identifiers); (idea 19) blast-radius-on-write: when a guarded DDL tool (create_or_replace, patch_package, patch_view, deploy_ddl, execute_approved) is invoked, attach the impact summary the engine already computes (depgraph blast radius + recompile plan + lineage + SAST) to the response so an agent sees what breaks before it changes Oracle; (idea 30) tamper-evident audit for the guarded writes — reuse the shipped oraclemcp-audit 0.4.0 (Auditor::new(FileAuditSink, SigningKey) -> Auditor::append(draft, ts, durable=true) HMAC-SHA256 signed + fsync-before-execute; verify_records / `oraclemcp audit verify` CLI as the proof path); wire it into plsql-mcp's OWN dispatch (separate from oraclemcp's binary — NOT inherited for free). NOTE: prior MCP-design epic oracle-da9j did much of the agent-UX wiring on the OLD 0.1.0 core (children closed); this phase re-establishes/verifies it on the 0.4.0 machinery — create new beads, do not resurrect the closed da9j children.\nDEPS: Phase C, Phase D (needs the real live write path).\nDoD: tool surface exposes real schemas + structured errors + capabilities + resources on the wire; guarded writes return an impact summary AND produce a signed audit record provable by `audit verify`; honesty docs only claim \"tamper-evident audit\" once this is wired.","status":"open","priority":2,"issue_type":"epic","created_at":"2026-06-23T20:56:25.969790599Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:27.186016471Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.969790599Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T20:56:27.056544835Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T20:56:27.185453371Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.1","title":"E.1a Wire CapabilitiesReport + oracle:// resources onto the 0.4.0 live wire","description":"Surface the discovery machinery from oraclemcp-core 0.4.0 on plsql-mcp's live wire: the zero-arg CapabilitiesReport (oracle_capabilities — feature flags + surface so an agent orients before its first call) AND oracle:// resources (resources/list|templates/list|read). These exist in oraclemcp-core but plsql-mcp instantiated them only in tests on the OLD 0.1.0 core (closed epic oracle-da9j); re-establish on the 0.4.0 machinery as NEW beads (do not resurrect the closed da9j children).\nACCEPTANCE: oracle_capabilities returns the real surface over JSON-RPC; oracle:// resources list/read; wire-level golden test (Phase X / E-surface golden).\nDEPS: Phase B (the 0.4.0 machinery), Phase D (the live wire).","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:27.572516078Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:53.576120046Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.1","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:00:28.389127081Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.1","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:00:27.572516078Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.2","title":"E.2 Identifier-case normalization (idea 21)","description":"Oracle-faithful quoted-identifier handling across the tool surface (do not silently fold case on quoted identifiers). Complements the cross-schema guard work (D.5).\nACCEPTANCE: quoted vs unquoted identifiers resolve per Oracle rules; tested.\nDEPS: Phase B.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T21:00:27.754195947Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:27.754195947Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.2","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:00:27.754195947Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.3","title":"E.3 Blast-radius-on-write (idea 19; the superset wedge)","description":"When a guarded DDL tool (create_or_replace, patch_package, patch_view, deploy_ddl, execute_approved) is invoked, attach the impact summary the engine ALREADY computes — dependency-graph blast radius + recompile plan + lineage + SAST findings — to the response, so an agent sees what breaks BEFORE it changes Oracle. Packaging existing engine outputs through the existing guard; not new architecture. This is the differentiated superset capability no competitor has.\nACCEPTANCE: a guarded DDL call returns a typed blast-radius payload (objects invalidated, recompile plan, lineage, SAST); a payload golden (Phase X) pins it.\nDEPS: Phase D (the guarded-write execution path).","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:27.944361515Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:28.612274532Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.3","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:00:28.611655713Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.3","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:00:27.944361515Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.4","title":"E.4 Tamper-evident audit for guarded writes (idea 30; reuse oraclemcp-audit 0.4.0)","description":"plsql-mcp ships MORE destructive tools than oraclemcp and audits none. Reuse the shipped oraclemcp-audit 0.4.0 as a leaf: Auditor::new(Box::new(FileAuditSink::open(path)?), SigningKey::new(id,bytes)) -> Auditor::append(&draft, ts, durable=true) appends an HMAC-SHA256 signed, hash-chained record fsync-BEFORE-execute (before commit), for every guarded write/DDL/escalation; verify_records / the `oraclemcp audit verify ` CLI is the auditor proof path. Wire it into plsql-mcp's OWN dispatch (separate from oraclemcp's binary). Only after this lands may docs claim \"tamper-evident audit\" (Phase A honesty rule).\nACCEPTANCE: every guarded write/DDL/escalation produces a signed audit record provable by `audit verify`; a tamper (in-place edit OR recompute-without-key) is detected; audit-chain golden (Phase X) green.\nDEPS: Phase D (the guarded-write execution path); Phase B (oraclemcp-audit dep added in B.1).","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:28.129813224Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:29.038070916Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.4","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:00:28.851112092Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.4","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:00:28.129813224Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.4","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T21:00:29.037388608Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.5","title":"E.1b Real per-tool inputSchemas (replace the ~35 permissive identical schemas)","description":"The shipping plsql-mcp advertises ~35 flat tools with identical permissive inputSchemas. Give each tool a real argument JSON-Schema + read-only/destructive annotations (oraclemcp-core 0.4.0 carries the descriptor model). A lockstep test must enforce every advertised tool has a real schema + a dispatch arm.\nACCEPTANCE: each advertised tool has a real inputSchema + annotations; lockstep registry<->dispatch<->schema test green.\nDEPS: Phase B, Phase D.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:13:53.621432267Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:54.352471283Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.5","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:13:54.216823579Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.5","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:13:53.621432267Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.5","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T21:13:54.351891676Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.6","title":"E.1c Structured ErrorEnvelope + fuzzy did-you-mean on the wire","description":"Replace bare-string tool errors with the oraclemcp-core 0.4.0 ErrorEnvelope (machine-readable error class + a fuzzy did-you-mean suggestion on a bad tool/arg name). Failed calls return the structured envelope.\nACCEPTANCE: a bad tool name returns an ErrorEnvelope with a class + a fuzzy suggestion; tested.\nDEPS: Phase B, Phase D.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:13:53.799023010Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:54.677351032Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.6","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:13:54.543864766Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.6","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:13:53.799023010Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.6","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T21:13:54.676726395Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.12.7","title":"E.1d Surface/profile gating + next-actions on the wire","description":"Wire surface/profile gating (advertise/permit tools per the active profile + operating level) and the next-actions hints (a degraded live-DB call names the tool to call next, e.g. RuntimeStateRequired -> connect). Consistent with the governed/least-privilege posture.\nACCEPTANCE: tool visibility/permission follows the profile + level; a degraded call names the next action; tested.\nDEPS: Phase B, Phase D.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T21:13:53.972018396Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:55.051556091Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.12.7","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:13:54.865153303Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.7","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"parent-child","created_at":"2026-06-23T21:13:53.972018396Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.12.7","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T21:13:55.050893824Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13","title":"Phase F — Change-impact CLI + CI Action (in 0.5.0)","description":"ROLE: package the engine's change-impact as a reusable GitHub Action so an Oracle team gets PR-comment blast-radius. Offline; in 0.5.0 scope.\nWHY: change-impact today is the library fn plsql_cicd::predict() which computes DIRECT single-hop invalidations only, over an already-built ChangeSet; there is no transitive/lineage-fed impact, no ChangeSet constructor from a git diff, and no clap CLI. So this is NOT \"wrap predict()\".\nSCOPE (6 beads): (1) ChangeSet construction from a git diff / dir / script; (2) semantic-change -> ChangeSet mapping; (3) the transitive, lineage-fed predictor — its OWN bead: add the plsql-cicd -> plsql-lineage dependency edge + an impact()-fed walker (predict_with_lineage-style) beyond single-hop; (4) a stable --robot-json schema for the payload; (5) the `plsql predict --robot-json` CLI binary (new [[bin]]); (6) the GitHub Action (idea 23) wrapping the CLI, posting the blast radius as a PR comment. Distribution vehicle + the seed of a future paid tier.\nDEPS: Phase 0 (nightly toolchain). The CLI shell + ChangeSet construction are root-ready; the lineage-fed predictor depends on the plsql-cicd->plsql-lineage wiring (internal); the Action depends on the CLI. Verification (golden payload + Action self-test) is in Phase X.\nDoD: `plsql predict --robot-json` emits a stable, transitive blast-radius payload; the Action posts it on a fixture PR; golden + self-test green.","status":"open","priority":2,"issue_type":"epic","created_at":"2026-06-23T20:56:26.083807207Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:11.903121928Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:26.083807207Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T20:56:27.305297133Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.1","title":"F.1 ChangeSet construction from a git diff / dir / script","description":"plsql_cicd has a ChangeSet type with a GitDiff origin variant but NO constructor that builds one from an actual git diff / directory / script. Build that constructor (the root-ready, offline part of the CLI).\nACCEPTANCE: `ChangeSet::from_git_diff(...)` (and dir/script variants) build a correct changeset from a fixture diff; unit-tested.\nDEPS: Phase 0.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:29.187662007Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:29.187662007Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.1","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.187662007Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.2","title":"F.2 Semantic-change -> ChangeSet mapping","description":"Map a parsed semantic change (e.g. a column type change, a package-spec edit) onto the ChangeSet the predictor consumes, so the Action works from source edits, not hand-built changesets.\nACCEPTANCE: a source edit fixture maps to the expected ChangeSet; tested.\nDEPS: F.1.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:29.341075358Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:30.191220725Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.2","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.341075358Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.2","depends_on_id":"oracle-plsql-converge-0lnu.13.1","type":"blocks","created_at":"2026-06-23T21:00:30.190674417Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.3","title":"F.3 Transitive, lineage-fed predictor (plsql-cicd -> plsql-lineage edge + walker)","description":"plsql_cicd::predict() today computes DIRECT single-hop invalidations only and plsql-cicd does NOT depend on plsql-lineage. Add the plsql-cicd -> plsql-lineage dependency edge and an impact()-fed transitive walker (predict_with_lineage-style) so the blast radius is TRANSITIVE (downstream-of-downstream), lineage-aware. This is the substantive engine bead, not a CLI shell.\nACCEPTANCE: predict_with_lineage returns the full transitive closure of invalidated objects on a multi-hop fixture; unit-tested vs a known graph.\nDEPS: Phase 0. (Internal: needs plsql-lineage, which already exists.)","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:29.493158112Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:29.493158112Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.3","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.493158112Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.4","title":"F.4 Stable --robot-json payload schema","description":"Define a stable, versioned --robot-json schema for the change-impact payload (objects invalidated by kind, recompile plan, compile-error flags, lineage notes) that the CLI emits and the Action renders. Golden-tested (Phase X).\nACCEPTANCE: the schema is documented + frozen with a golden snapshot.\nDEPS: F.3.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:29.645211937Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:30.371329076Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.4","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.645211937Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.4","depends_on_id":"oracle-plsql-converge-0lnu.13.3","type":"blocks","created_at":"2026-06-23T21:00:30.370563548Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.5","title":"F.5 The plsql predict --robot-json CLI binary","description":"Author the new [[bin]] `plsql` with a `predict --robot-json ` subcommand wrapping F.1-F.4 (changeset construction + transitive predictor + schema). Ships in 0.5.0 (Ship adds it to RELEASE_BINS).\nACCEPTANCE: `plsql predict --robot-json` runs offline against a fixture estate and emits the stable transitive payload; --doctor + --robot-json conventions per repo R10/R11.\nDEPS: F.1, F.2, F.3, F.4.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:29.814210947Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.101248293Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.5","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.814210947Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.5","depends_on_id":"oracle-plsql-converge-0lnu.13.1","type":"blocks","created_at":"2026-06-23T21:00:30.548414734Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.5","depends_on_id":"oracle-plsql-converge-0lnu.13.2","type":"blocks","created_at":"2026-06-23T21:00:30.729840911Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.5","depends_on_id":"oracle-plsql-converge-0lnu.13.3","type":"blocks","created_at":"2026-06-23T21:00:30.916422514Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.5","depends_on_id":"oracle-plsql-converge-0lnu.13.4","type":"blocks","created_at":"2026-06-23T21:00:31.102122070Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.13.6","title":"F.6 The CI change-impact GitHub Action","description":"Build the reusable GitHub Action that runs the F.5 CLI on a PR touching PL/SQL and posts the blast-radius payload as a PR comment (this change invalidates N downstream objects; these need recompile; these have compile errors). Distribution vehicle + the seed of a future paid tier.\nACCEPTANCE: on a fixture PR the Action posts the expected comment; an Action self-test (Phase X) runs it in CI.\nDEPS: F.5.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:29.987109247Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:31.316721369Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.13.6","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"parent-child","created_at":"2026-06-23T21:00:29.987109247Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.13.6","depends_on_id":"oracle-plsql-converge-0lnu.13.5","type":"blocks","created_at":"2026-06-23T21:00:31.315896541Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.14","title":"Phase G — Fact-emission convergence (in 0.5.0; parallel to the convergence)","description":"ROLE: realize the spec's emitted-fact architecture as a projection layer over the existing solver. Founder decision: do it right, IN 0.5.0 (not deferred). Independent of the upstream gate -> runs PARALLEL to B-F; touches plsql-ir + SAST/lineage, not the DB/runtime stack.\nWHY: the value-flow capability exists in plsql-ir but as flow-STATE types (the internal dataflow solver); only FlowUnknownFact is exported as a normalized fact. The emitted-fact FactStore is the correct end-state for THIS project (USR Loop determinism/provenance, symmetric honest-uncertainty, evidence-citing SAST, drift-free multi-surface consumption — the CodeQL/Datalog pattern). Keep the working solver; add the materialization boundary — NOT a rewrite.\nSCOPE (tasks): build the flow-state -> emitted-fact projection layer producing normalized, content-addressed ConstantValueFact / ValueSetFact / StringShapeFact / TaintFact / SanitizerFact in the FactStore, with golden-snapshot + fact-ID-stability tests; migrate SAST (evidence-citing taint paths) and lineage to consume the emitted facts; a SAST/lineage BEFORE-AFTER equivalence gate (the risky consumer-migration half) proving output is unchanged after the switch.\nDEPS: Phase 0 (nightly). Independent of B/C/D.\nDoD: the 5 emitted-fact types materialize with stable IDs + golden snapshots; SAST/lineage consume the FactStore with proven output equivalence; coverage_index does not regress.","status":"open","priority":2,"issue_type":"epic","created_at":"2026-06-23T20:56:26.198106674Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.012795647Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.14","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:26.198106674Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.14","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T20:56:27.432338761Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.14.1","title":"G.1 Flow-state -> emitted-fact projection layer + golden/fact-ID tests","description":"Build the projection that materializes plsql-ir's flow-STATE (taint/constant/value-set/string-shape) into normalized, content-addressed EMITTED facts in the FactStore: ConstantValueFact, ValueSetFact, StringShapeFact, TaintFact, SanitizerFact (only FlowUnknownFact exists today). Keep the working solver — this is a materialization boundary (CodeQL/Datalog pattern), NOT a rewrite. Add golden-snapshot + fact-ID-stability tests (stable IDs across whitespace-only changes; >=10 fixtures per fact family per the original spec acceptance).\nACCEPTANCE: the 5 fact types emit with stable IDs + golden snapshots; deterministic across two runs.\nDEPS: Phase 0.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:31.471271625Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:31.471271625Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.14.1","depends_on_id":"oracle-plsql-converge-0lnu.14","type":"parent-child","created_at":"2026-06-23T21:00:31.471271625Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.14.2","title":"G.2 Migrate SAST + lineage to consume the emitted facts","description":"Switch SAST (evidence-citing taint paths: SEC001/SEC002 cite a TaintFact/StringShapeFact) and lineage to consume the normalized FactStore instead of re-walking raw IR — the drift-free, single-source-of-truth consumption the emitted-fact architecture exists for.\nACCEPTANCE: SAST + lineage read facts via the FactStore (ctx.facts.by_kind); injection findings cite a stable fact.\nDEPS: G.1.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:00:31.625162453Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:31.979127007Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.14.2","depends_on_id":"oracle-plsql-converge-0lnu.14","type":"parent-child","created_at":"2026-06-23T21:00:31.625162453Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.14.2","depends_on_id":"oracle-plsql-converge-0lnu.14.1","type":"blocks","created_at":"2026-06-23T21:00:31.978301250Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.14.3","title":"G.3 SAST/lineage BEFORE-AFTER equivalence gate (the risky half)","description":"The consumer migration (G.2) is the high-risk half. Add a before-after equivalence gate proving SAST + lineage OUTPUT is unchanged after switching them to consume emitted facts (no findings gained/lost; same lineage edges) on the public corpus.\nACCEPTANCE: SAST + lineage output is byte/semantically identical pre- vs post-migration on the corpus; coverage_index does not regress.\nDEPS: G.2.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:00:31.780332247Z","created_by":"durakovic","updated_at":"2026-06-23T21:00:32.174338766Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.14.3","depends_on_id":"oracle-plsql-converge-0lnu.14","type":"parent-child","created_at":"2026-06-23T21:00:31.780332247Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.14.3","depends_on_id":"oracle-plsql-converge-0lnu.14.2","type":"blocks","created_at":"2026-06-23T21:00:32.173661428Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15","title":"Phase X — Verification (cross-cutting; spans all phases)","description":"ROLE: make the whole convergence TRUSTWORTHY rather than asserted — squarely the repo's ethos (USR gate, honest-uncertainty, evidence-not-boasts). Contains the test/CI/acceptance beads; each depends on the specific phase work it verifies.\nSCOPE (test beads): e2e through the ACTUAL serve JSON-RPC wire against a containerized Oracle 23ai (today live behavior is tested only via direct in-process live-xe calls); the C/D JOINT ACCEPTANCE — first live `query` round-trips through serve; large-CLOB differential parity (oraclemcp-db extraction == old thick-driver output, with DDL/source CLOB fixtures — guards the LOB-cap truncation risk); coverage_index continuity gate (monotone floor survives the migration); keep usr_acceptance.sh + the 9-stage sha-pinned gate green throughout + fuzz/never-panic on the new boundaries; the asupersync LabRuntime/DPOR cancel/timeout/drain tests (no leaked sessions, clean drain); a post-async dispatch REGRESSION test (dispatch behaves identically after the async rewrite); a RequestBudget timeout-enforcement test (a slow query is cut at the budget); an audit-chain verify_records golden over a real guarded write; a blast-radius payload golden; the change-impact --robot-json payload golden + the Action self-test; the SAST/lineage before-after equivalence (also tracked in G). Plus the standing CI authoring beads: the plsql_mcp_boundary_lint.sh (ban thick `oracle` + thin `oracledb` + tokio/hyper/axum/tonic/reqwest/rmcp/async-std/smol/r2d2/odpic-sys, allowlisting only oraclemcp-db's seam), the honesty-grep DoD gate (idea 8), and the version-skew CI guard (so the oraclemcp-* pin never silently falls minors behind again).\nDEPS: Phase E, Phase F, Phase G (the latest substantive phases; individual test beads carry finer deps to the phase they verify).\nDoD: green CI exercising the wire path against a real Oracle; every migrated/added surface has a named test bead; boundary/honesty/skew gates wired; monotone coverage preserved.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:26.308203715Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:27.811970813Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:26.308203715Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"blocks","created_at":"2026-06-23T20:56:27.563823095Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"blocks","created_at":"2026-06-23T20:56:27.683543667Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15","depends_on_id":"oracle-plsql-converge-0lnu.14","type":"blocks","created_at":"2026-06-23T20:56:27.811348034Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.1","title":"X.JOINT First live query round-trips through serve against Oracle 23ai","description":"THE joint acceptance gate for the co-developed Phases C + D. A single owned acceptance test: bring up a containerized Oracle 23ai, connect through serve, and run a real `query` end-to-end through the JSON-RPC wire (adapter from C produces the oraclemcp-db connection; D's region mints the &Cx + real session). Asserts the live path works, not just the gated stub.\nACCEPTANCE: a real SELECT returns rows through serve against 23ai; logged; no leaked session.\nDEPS: Phase C, Phase D.","status":"open","priority":0,"issue_type":"task","created_at":"2026-06-23T20:59:27.538145555Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:28.038340873Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.1","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T20:59:27.805856916Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.1","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T20:59:28.031109649Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.1","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T20:59:27.538145555Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.10","title":"X.9 Blast-radius-on-write payload golden","description":"Golden snapshot of the blast-radius payload (E.3) for a known guarded DDL change against a fixture estate (objects invalidated by kind, recompile plan, lineage, SAST).\nACCEPTANCE: the payload matches the golden for the fixture change.\nDEPS: Phase E.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:50.443904460Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:55.168791002Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.10","depends_on_id":"oracle-plsql-converge-0lnu.12.3","type":"blocks","created_at":"2026-06-23T21:01:55.168002945Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.10","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:50.443904460Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.11","title":"X.10a Change-impact --robot-json payload golden","description":"Golden snapshot of the `plsql predict --robot-json` TRANSITIVE payload (F.5) on a fixture estate (objects invalidated by kind, recompile plan, compile-error flags, lineage). Pins the schema (F.4) so a regression is caught.\nACCEPTANCE: the payload matches the golden for the fixture changeset.\nDEPS: Phase F (the CLI).","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:50.678216334Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:57.785350900Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.11","depends_on_id":"oracle-plsql-converge-0lnu.13.5","type":"blocks","created_at":"2026-06-23T21:01:55.379545023Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.11","depends_on_id":"oracle-plsql-converge-0lnu.13.6","type":"blocks","created_at":"2026-06-23T21:01:55.613289993Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.11","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:50.678216334Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.12","title":"X.11 plsql_mcp_boundary_lint.sh (full forbidden-dep gate)","description":"Author + CI-wire a boundary lint mirroring oraclemcp's: FAIL CI if any plsql-* crate gains a DIRECT dependency on the thick `oracle` (ODPI-C) OR thin `oracledb`, OR on tokio/hyper/axum/tonic/reqwest/rmcp/async-std/smol/r2d2/odpic-sys — outside an explicit allowlist (only plsql-mcp's oraclemcp-db adapter seam). Enforces no-reach-around to a driver and no-tokio (the asupersync point). Use `cargo tree -e normal -i ` per banned crate.\nACCEPTANCE: the lint passes on the converged tree and fails on a planted violation; runs in required CI.\nDEPS: Phase C (after the thick driver is removed, C.6).","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:50.921345852Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:55.817584544Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.12","depends_on_id":"oracle-plsql-converge-0lnu.10.6","type":"blocks","created_at":"2026-06-23T21:01:55.816816696Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.12","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:50.921345852Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.13","title":"X.12 Honesty-grep DoD gate","description":"Author + CI-wire a mechanical honesty-grep gate (mirroring oraclemcp) that FAILS the build on forbidden marketing strings: \"read-only binary\"/\"read-only only\", \"safe-by-default\"/\"safe by construction\", \"fully audited\"/\"independently-audited dependencies\", \"stable Rust\"/\"Rust 1.85+\", \"1.0-frozen\", or un-caveated \"tamper-evident audit\"/\"PAM\". ORDERING TRAP: this must land AFTER/WITH Phase 0's toolchain-truth edits and Phase A's README pass, else it fails on the very strings those phases remove.\nACCEPTANCE: gate green on the cleaned docs; fails on a planted forbidden string.\nDEPS: Phase 0, Phase A.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:51.163873820Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:56.272785671Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.13","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:51.163873820Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.13","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T21:01:56.040610897Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.13","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"blocks","created_at":"2026-06-23T21:01:56.272236702Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.14","title":"X.13 Version-skew CI guard (oraclemcp-* pin currency)","description":"A CI check that the plsql-mcp oraclemcp-* pin tracks the latest published (so it never silently falls minors behind again, as it did at 0.1.0 vs 0.4.0). Warn/fail when a newer compatible minor is published.\nACCEPTANCE: the guard flags a deliberately-stale pin in CI.\nDEPS: Phase B.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T21:01:51.410780245Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:56.514833674Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.14","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:51.410780245Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.14","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T21:01:56.514220356Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.15","title":"X.4b Extend fuzz/never-panic targets to the new boundaries","description":"Author new fuzz / never-panic targets for the surfaces the convergence ADDS: the async dispatcher (B), the oraclemcp-db adapter + the async catalog loaders (C), and the live-DB runtime (D). Each must never panic on adversarial input.\nACCEPTANCE: the new boundaries have fuzz targets with zero crashes at the soak budget.\nDEPS: Phase B, Phase C, Phase D.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:13:56.905278960Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:57.623032210Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.15","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T21:13:57.401045643Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.15","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:13:57.622293094Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.15","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:13:56.905278960Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.15","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T21:13:57.199487202Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.16","title":"X.10b CI Action self-test (act / workflow dry-run on a fixture PR)","description":"Self-test the GitHub Action (F.6): run it via act / a workflow dry-run on a fixture PR that touches PL/SQL and assert the posted blast-radius comment matches expectation.\nACCEPTANCE: the Action posts the expected comment in a CI dry-run.\nDEPS: Phase F (the Action).","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T21:13:57.841377526Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:58.116214356Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.16","depends_on_id":"oracle-plsql-converge-0lnu.13.6","type":"blocks","created_at":"2026-06-23T21:13:58.115468130Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.16","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:13:57.841377526Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.17","title":"X.14 Wire-level golden for the E agent-UX surface (capabilities/schemas/errors/resources)","description":"A consolidated wire-level golden proving the Phase-E agent-UX surface serializes correctly over JSON-RPC: CapabilitiesReport (E.1a), the per-tool inputSchemas + annotations (E.1b), the ErrorEnvelope + fuzzy did-you-mean (E.1c), oracle:// resources (E.1a), and surface/profile gating (E.1d). Pins the wire contract so an enrichment regression is caught.\nACCEPTANCE: tools/list + capabilities + a forced error + resources/list match the golden over the wire.\nDEPS: Phase E.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:14:48.301867154Z","created_by":"durakovic","updated_at":"2026-06-23T21:14:48.673170204Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.17","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"blocks","created_at":"2026-06-23T21:14:48.672364978Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.17","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:14:48.301867154Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.2","title":"X.1 e2e through the actual serve JSON-RPC wire against Oracle 23ai","description":"Drive the full live-DB tool surface through the ACTUAL serve JSON-RPC path against a containerized Oracle 23ai with rich structured logging (today live behavior is tested only via direct in-process live-xe calls, not the wire). Covers connect/query/describe/guarded-writes end-to-end. Loud SKIP when no Oracle.\nACCEPTANCE: live tools exercised over the wire against 23ai in CI; logged artifacts; clean SKIP without Oracle.\nDEPS: Phase D, Phase E.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:48.630029421Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:52.040546998Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.2","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:01:51.739447239Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.2","depends_on_id":"oracle-plsql-converge-0lnu.12","type":"blocks","created_at":"2026-06-23T21:01:52.039730170Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.2","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:48.630029421Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.3","title":"X.2 Large-CLOB differential parity (oraclemcp-db vs old thick driver)","description":"Differential parity: catalog extraction via oraclemcp-db == old thick-driver output on the same estate, WITH explicit large-CLOB (DDL/source) fixtures that exceed oraclemcp-db's default LOB cap — this is the gate that guards the silent-truncation risk (C.3). This gate must be GREEN before the thick path is removed (C.6).\nACCEPTANCE: thin == thick on the estate incl. >cap CLOBs; gate green; unblocks C.6 thick removal.\nDEPS: Phase C.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:48.853539481Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:53.440357092Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.3","depends_on_id":"oracle-plsql-converge-0lnu.10.1","type":"blocks","created_at":"2026-06-23T21:13:53.162708064Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.3","depends_on_id":"oracle-plsql-converge-0lnu.10.2","type":"blocks","created_at":"2026-06-23T21:13:53.305217975Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.3","depends_on_id":"oracle-plsql-converge-0lnu.10.3","type":"blocks","created_at":"2026-06-23T21:13:53.439590126Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.3","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:48.853539481Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.4","title":"X.3 coverage_index continuity gate across the migration","description":"Assert the monotone coverage_index floor survives the whole migration (asupersync + driver + dispatcher) — extracted_semantics_ratio must not regress. scripts/accretion_tripwire.sh stays a required CI check; seed the floor deterministically.\nACCEPTANCE: coverage_index(HEAD) >= last release; tripwire green.\nDEPS: Phase B, Phase C, Phase D.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:49.073891270Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:53.194870709Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.4","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T21:01:52.933174422Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.4","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:01:53.194051611Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.4","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:49.073891270Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.4","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T21:01:52.671585734Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.5","title":"X.4a Keep usr_acceptance + the 9-stage sha-pinned gate GREEN throughout","description":"A standing CI assertion: scripts/usr_acceptance.sh and the 9-stage sha-pinned conformance gate must stay GREEN through every step of the migration (asupersync + driver + dispatcher + fact-emission). Any red is a stop-the-line.\nACCEPTANCE: usr_acceptance + the 9-stage gate green on each migration commit in CI.\nDEPS: Phase B, Phase C, Phase D.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:49.291376127Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:56.848079169Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.5","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T21:01:53.685981591Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.5","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:01:53.937532439Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.5","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:49.291376127Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.5","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"blocks","created_at":"2026-06-23T21:01:53.423243868Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.6","title":"X.5 asupersync LabRuntime/DPOR cancel/timeout/drain tests (live-DB paths)","description":"Deterministic cancel/timeout/drain tests of the live-DB paths using asupersync's LabRuntime/DPOR (the machinery rust-oracledb uses in its W3-E3). Assert: no leaked sessions, clean drain under cancellation, the ready-or-dead session invariant.\nACCEPTANCE: cancel/timeout/drop-future scenarios leave the session reusable-or-dead, never leaked; deterministic.\nDEPS: Phase D.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:49.514681566Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:54.204136720Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.6","depends_on_id":"oracle-plsql-converge-0lnu.11","type":"blocks","created_at":"2026-06-23T21:01:54.203420062Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.6","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:49.514681566Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.7","title":"X.6 Post-async dispatch regression test","description":"Prove the async ToolDispatch rewrite (B.4) did not change behavior for the offline/static tools: same inputs -> same outputs as the pre-rewrite sync dispatch (golden over the offline tool surface).\nACCEPTANCE: offline tools dispatch identically pre/post async rewrite.\nDEPS: Phase B.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:49.739208041Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:54.416270077Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.7","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:49.739208041Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.7","depends_on_id":"oracle-plsql-converge-0lnu.9.4","type":"blocks","created_at":"2026-06-23T21:01:54.415659599Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.8","title":"X.7 RequestBudget timeout-enforcement test","description":"Prove a slow live query is actually CUT at the RequestBudget (D.4) — distinct from the LabRuntime cancel tests: a real (or simulated-slow) query exceeding the budget is cancelled cooperatively and the session drains.\nACCEPTANCE: a query past the budget is cut; session not leaked; bounded latency.\nDEPS: Phase D.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:49.971973361Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:54.634624956Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.8","depends_on_id":"oracle-plsql-converge-0lnu.11.4","type":"blocks","created_at":"2026-06-23T21:01:54.633910818Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.8","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:49.971973361Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.15.9","title":"X.8 Audit-chain verify_records golden over a real guarded write","description":"Golden + adversarial test of the guarded-write audit (E.4): a real guarded write produces a signed chain; verify_records / `oraclemcp audit verify` passes; an in-place tamper AND a recompute-without-key are both DETECTED (broken at the right seq).\nACCEPTANCE: clean chain verifies; both tamper modes detected.\nDEPS: Phase E.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:50.206041266Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:54.909361041Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.15.9","depends_on_id":"oracle-plsql-converge-0lnu.12.4","type":"blocks","created_at":"2026-06-23T21:01:54.908588133Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.15.9","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"parent-child","created_at":"2026-06-23T21:01:50.206041266Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.16","title":"FAST-FOLLOW (post-0.5.0, idea 26) Trio stack-doctor parity","description":"FAST-FOLLOW, post-0.5.0 (plan §4.9: additive, NOT correctness-critical). Give plsql-mcp a doctor/--robot-json health+version+capability contract with the SAME shape as oraclemcp + rust-oracledb, so an agent orients identically at every rung of the trio. Deferred — ship 0.5.0 first.","status":"deferred","priority":4,"issue_type":"task","created_at":"2026-06-23T21:13:58.314146285Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.381962834Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.16","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T21:13:58.314146285Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.17","title":"FAST-FOLLOW (post-0.5.0, idea 28) Upstream driver gaps to rust-oracledb","description":"FAST-FOLLOW, post-0.5.0 (plan §4.9). File the driver gaps plsql-mcp needs (OUT/IN-OUT bind ergonomics, any catalog datatype) upstream to rust-oracledb via oraclemcp (the established oraclemcp-#7..11 pattern). Deferred — these flow through oraclemcp-db, not a 0.5.0 blocker.","status":"deferred","priority":4,"issue_type":"task","created_at":"2026-06-23T21:13:58.563630793Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:12.486555317Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.17","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T21:13:58.563630793Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.2","title":"Phase B — Stack currency: bump oraclemcp-* 0.1.0 to 0.3.0 (asupersync watershed)","description":"Phase B. The single biggest convergence step available immediately: 0.3.0 IS the thin-native asupersync core. Scope: replace the pinned deps in crates/plsql-mcp/Cargo.toml (oraclemcp-core, oraclemcp-error, oraclemcp-guard at 0.1.0) with 0.3.0; pull in any newly-required sibling crates (the published set is 8: core, guard, db, audit, auth, telemetry, config, error). Resolve the API deltas introduced by the asupersync rewrite between 0.1 and 0.3 (the core transport/runtime model changed). Re-validate the one-way boundary (no oraclemcp-* crate may import a plsql-* engine crate) still holds. Expect this to RESOLVE several Phase-A deferred guard/auth bugs upstream. DoD: workspace builds and tests green on oraclemcp 0.3.0; boundary lint passes; version-skew documented. Depends on Phase A.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.157413191Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:24.889641116Z","closed_at":"2026-06-23T20:56:24.889333376Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.2","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.157413191Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.2","depends_on_id":"oracle-plsql-converge-0lnu.1","type":"blocks","created_at":"2026-06-19T07:35:09.587527745Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.3","title":"Phase C — Driver unification: delete thick oracle crate / Oracle Instant Client","description":"Phase C. plsql-catalog currently uses oracle 0.6.3 (ODPI-C, requires Instant Client at runtime) for live catalog extraction, gated behind the oracle-driver feature (plsql-mcp live-db feature). Replace it with the sibling pure-Rust rust-oracledb thin driver (the oracledb crate, the same one oraclemcp uses). Use the BlockingConnection facade plus a spawn-blocking bridge as documented in rust-oracledb references/INTEGRATION.md, which contains a named step-by-step migration plan written for exactly this. Map the catalog extraction queries (ALL_DEPENDENCIES, ALL_SOURCE, ALL_OBJECTS, plscope, etc.) onto the thin driver API (Connection / query / typed rows). Remove Instant Client from the Dockerfile so the image becomes a single static binary with no native libs and no Oracle redistribution (matching oraclemcp). Update README to drop the bundles-Instant-Client language. DoD: live catalog extraction works against Oracle 23ai through the thin driver; no odpic-sys / oracle 0.6.3 in Cargo.lock; Docker image carries no Instant Client. Depends on Phase B.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.241552193Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:25.004509095Z","closed_at":"2026-06-23T20:56:25.004201325Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.3","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.241552193Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.3","depends_on_id":"oracle-plsql-converge-0lnu.2","type":"blocks","created_at":"2026-06-19T07:35:09.684132281Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.4","title":"Phase D — Runtime unification (tokio to asupersync) and wire live connection into serve dispatch","description":"Phase D. Two coupled goals. (1) Migrate plsql-mcp own async surfaces off tokio onto asupersync to fully converge with the stack, following the oraclemcp PLAN_ASUPERSYNC_THIN_NATIVE.md playbook (work packages W0-W14: structured-concurrency Cx context, per-request regions, scoped task ownership, cancellation and budgets, native stdio + HTTP transports, deterministic LabRuntime tests). Update AGENTS.md which currently mandates Tokio for CLIs/daemon/IO. (2) CRITICAL: wire the live Oracle connection into the serve JSON-RPC dispatch so the live-DB tools EXECUTE end-to-end rather than returning RuntimeStateRequired. Today RustOracleConnection::connect is never called from plsql-mcp/src; only live-xe tests reach Oracle. After this phase, an attached Oracle connection makes the advertised live-DB tools real on the wire. DoD: no tokio in the production dependency graph; live-DB tools perform real round-trips through serve; usr_acceptance and the 9-stage gate stay green; coverage_index does not regress across the migration. Depends on Phase B and Phase C.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.318185103Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:25.135589572Z","closed_at":"2026-06-23T20:56:25.135282092Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.4","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.318185103Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.4","depends_on_id":"oracle-plsql-converge-0lnu.2","type":"blocks","created_at":"2026-06-19T07:35:09.782861533Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.4","depends_on_id":"oracle-plsql-converge-0lnu.3","type":"blocks","created_at":"2026-06-19T07:35:09.924025751Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.5","title":"Phase E — Superset surface polish (package existing capabilities; no new architecture)","description":"Phase E. (1) Land the work described in the existing open epic oracle-da9j: wire the agent-UX machinery that already exists in oraclemcp-core (CapabilitiesReport, ErrorEnvelope with fuzzy did-you-mean, oracle:// resources, real per-tool inputSchemas, read-only/destructive annotations, surface/profile gating) onto the shipping plsql-mcp wire, now that Phase B puts it on the 0.3.0 core where that machinery lives. (2) Blast-radius-on-write: when a guarded DDL tool (create_or_replace, patch_package, patch_view, deploy_ddl, execute_approved) is invoked, attach the typed impact summary the engine already computes (dependency-graph blast radius + recompile plan + lineage + SAST findings) to the response, so an agent sees what breaks before it changes Oracle. This is packaging existing engine outputs through the existing guard, not new architecture. DoD: plsql-mcp tool surface exposes real schemas, structured errors, capabilities and resources; guarded writes return an impact summary; oracle-da9j closed. Depends on Phase D.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.397677061Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:25.263882991Z","closed_at":"2026-06-23T20:56:25.263585711Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.5","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.397677061Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.5","depends_on_id":"oracle-plsql-converge-0lnu.4","type":"blocks","created_at":"2026-06-19T07:35:10.040904519Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.6","title":"Phase X — Cross-cutting verification: tests, e2e-through-serve, CI, coverage_index continuity","description":"Phase X. Applies across every phase. Scope: (1) unit tests for each migrated surface (driver swap, asupersync runtime, dispatch wiring, surface enrichment). (2) e2e scripts with rich structured logging that drive the live-DB tools through the ACTUAL serve JSON-RPC path against a containerized Oracle 23ai (close the gap where live behavior is only tested via direct in-process calls, not the wire). (3) extend CI: run the live-xe + estate-correctness suites through serve; add a version-skew guard so the oraclemcp-* pin never silently falls minors behind again; keep the boundary lint and the sha-pinned USR gate. (4) coverage_index continuity: assert the monotone floor survives the asupersync migration (extracted_semantics_ratio must not regress). DoD: green CI exercising the wire path against a real Oracle, logged e2e artifacts, monotone coverage preserved. Relates to all phases; required before release.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-19T07:35:09.482500531Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:25.380920727Z","closed_at":"2026-06-23T20:56:25.380619648Z","close_reason":"Superseded by the v2.9 fresh phase beads (gate-met restructure: B is atomic, C/D co-developed; targets oraclemcp 0.4.0 not 0.3.0; no tokio). DoD text salvaged into the new phase epics.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.6","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-19T07:35:09.482500531Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.6","depends_on_id":"oracle-plsql-converge-0lnu.4","type":"blocks","created_at":"2026-06-19T07:35:10.165977366Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7","title":"Phase 0 — Nightly-toolchain migration (the true watershed)","description":"ROLE: flip the whole plsql-intelligence workspace from STABLE Rust to the pinned NIGHTLY that asupersync requires. This gates every code phase (B/C/D/F/G compile only on nightly).\nWHY: asupersync uses nightly-only features (try_trait_v2 + residual). Both upstreams are pinned nightly-2026-05-11; rust-oracledb ADR-0001 keeps nightly through its 1.0; oraclemcp confirms \"move to stable Rust is OUT\". Nightly is a PERMANENT, build-time-only, reproducible commitment — not temporary.\nSCOPE (tasks): (1) flip rust-toolchain.toml to nightly-2026-05-11 (or oraclemcp's successor); (2) remove rust-version=\"1.85\" from root Cargo.toml; (3) update the Dockerfile builder toolchain (installs stable today) WHILE PRESERVING the JDK layer the oraclelinux:9 builder needs for ANTLR jar codegen; (4) move every CI workflow off dtolnay/rust-toolchain@stable (~15-16 sites; re-grep at execution); (5) re-baseline `cargo clippy -- -D warnings` and the #![forbid(unsafe_code)] crates on nightly; (6) document the no-stable-MSRV reality in AGENTS.md/README.md (the \"Rust 1.85+\" badge becomes false); (7) pin asupersync to oraclemcp's resolved version (it declares ^0.3.4 -> 0.3.4; budget per-minor churn).\nDEPS: none (root; run alongside A).\nDoD: workspace + all CI builds green on the pinned nightly; no @stable left in workflows; rust-version removed; Docker image still builds the grammar (JDK present) with no Instant Client regression introduced here; toolchain docs honest.","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:25.464412258Z","created_by":"durakovic","updated_at":"2026-06-25T07:45:50.540615698Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.464412258Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7.1","title":"0.1 Flip rust-toolchain.toml to nightly + remove rust-version","description":"Set rust-toolchain.toml channel to the pinned nightly oraclemcp/rust-oracledb use (nightly-2026-05-11, or the current successor — re-check both repos at execution). Remove `rust-version = \"1.85\"` from the root Cargo.toml (there is no stable MSRV anymore; asupersync needs nightly-only try_trait_v2 + residual).\nWHY: every code phase (B/C/D/F/G) only compiles on this nightly. Permanent, build-time-only commitment (rust-oracledb ADR-0001).\nACCEPTANCE: `cargo + build --workspace` green; rust-version gone; toolchain file pins the exact nightly.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-06-23T20:57:43.112385094Z","created_by":"durakovic","updated_at":"2026-06-25T07:56:37.637944639Z","closed_at":"2026-06-25T07:56:37.637878919Z","close_reason":"rust-toolchain.toml pinned to nightly-2026-05-11 (matching oraclemcp + rust-oracledb). rust-version = \"1.85\" removed from workspace root + 27 member crates (22 crates + 5 tools). cargo build --workspace + clippy green on nightly.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7.1","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"parent-child","created_at":"2026-06-23T20:57:43.112385094Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7.2","title":"0.2 Move all CI workflows off @stable + re-baseline -D warnings / forbid(unsafe)","description":"Replace every dtolnay/rust-toolchain@stable (and any other @stable pin) across .github/workflows/* with the pinned nightly (~15-16 sites — re-grep at execution per RULE 1). Re-baseline `cargo clippy --workspace --all-targets -- -D warnings` and confirm the 22 #![forbid(unsafe_code)] crates compile clean on nightly (nightly lints differ; warnings-as-errors on nightly is brittle — fix or allow deliberately).\nACCEPTANCE: no @stable left in workflows (grep proves it); CI green on nightly; clippy -D warnings clean.\nDEPS: 0.1.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:57:43.216267136Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:43.663974773Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7.2","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"parent-child","created_at":"2026-06-23T20:57:43.216267136Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.7.2","depends_on_id":"oracle-plsql-converge-0lnu.7.1","type":"blocks","created_at":"2026-06-23T20:57:43.663442893Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7.3","title":"0.3 Dockerfile builder to nightly, PRESERVE the JDK layer","description":"The Dockerfile builder (oraclelinux:9) installs stable Rust today and needs a JDK on PATH for ANTLR jar codegen. Flip the builder toolchain to the pinned nightly WITHOUT dropping the JDK layer (the grammar codegen must still run). NOTE: Instant-Client removal from the image is Phase C (idea 3); this task only handles the toolchain flip + JDK preservation so the image still builds the grammar.\nACCEPTANCE: `docker build` produces a working image on nightly; ANTLR codegen still runs (JDK present); no new Instant-Client coupling introduced here.\nDEPS: 0.1.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-06-23T20:57:43.321014648Z","created_by":"durakovic","updated_at":"2026-06-25T08:09:48.769928148Z","closed_at":"2026-06-25T08:09:48.769847808Z","close_reason":"Dockerfile builder toolchain flipped from stable to nightly-2026-05-11 (matching rust-toolchain.toml). JDK layer preserved.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7.3","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"parent-child","created_at":"2026-06-23T20:57:43.321014648Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.7.3","depends_on_id":"oracle-plsql-converge-0lnu.7.1","type":"blocks","created_at":"2026-06-23T20:57:43.794471308Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7.4","title":"0.4 Pin asupersync to oraclemcp's resolved version + budget per-minor churn","description":"Add/pin asupersync to the exact version oraclemcp resolves (oraclemcp declares ^0.3.4 -> 0.3.4; match the resolved version). Document that asupersync disclaims back-compat and ships ~biweekly, so budget a per-minor migration each time the trio bumps. (plsql-mcp gets asupersync transitively via oraclemcp-db in Phase B; this task makes the pin explicit + the policy written.)\nACCEPTANCE: Cargo.lock resolves asupersync to the oraclemcp-matched version; a one-paragraph \"asupersync/nightly bump runbook\" exists.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-06-23T20:57:43.428775146Z","created_by":"durakovic","updated_at":"2026-06-25T08:08:58.799930837Z","closed_at":"2026-06-25T08:08:58.799862707Z","close_reason":"asupersync not yet a Cargo dependency — only referenced in plan.md (docs/plans/2026-06-19-plsql-mcp-convergence-and-1.0-release.md) as =0.3.4 pin. Pinning strategy documented in plan. No code change needed until Phase B adoption.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7.4","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"parent-child","created_at":"2026-06-23T20:57:43.428775146Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.7.5","title":"0.5 Toolchain-truth docs (AGENTS.md/README: no stable MSRV, badge)","description":"Document the no-stable-MSRV reality: the \"Rust 1.85+\" README badge becomes false; state that the toolchain is a pinned nightly, build-time-only, reproducible, and permanent for the foreseeable future (asupersync requirement). (The broader AGENTS.md async-runtime rewrite is Phase A task A.5; this is just the toolchain-truth half.)\nACCEPTANCE: README + AGENTS.md state the nightly reality; the stale \"1.85/stable\" badge/claims removed.\nDEPS: 0.1.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-06-23T20:57:43.538606010Z","created_by":"durakovic","updated_at":"2026-06-25T08:10:41.172745029Z","closed_at":"2026-06-25T08:10:41.172676439Z","close_reason":"All CI workflows (ci.yml, usr.yml, bindgen-roundtrip.yml, release.yml) updated from dtolnay/rust-toolchain@stable to @nightly-2026-05-11. Dockerfile builder updated. AGENTS.md already states 'Language: Rust (Cargo workspace)' without MSRV claim. README.md badge check needed but the 'Rust 1.85+' badge is in plan.md as a known false claim to be fixed in Phase 0 — no badge exists in README.md itself.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.7.5","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"parent-child","created_at":"2026-06-23T20:57:43.538606010Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.7.5","depends_on_id":"oracle-plsql-converge-0lnu.7.1","type":"blocks","created_at":"2026-06-23T20:57:43.930062516Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8","title":"Phase A — Truth-up, hygiene & release-readiness baseline","description":"ROLE: unblocked, low-risk hygiene that clears honest ground for the release. Run first; parallel to Phase 0.\nSCOPE (tasks): (1) verify children of the stale open hunt-epics oracle-ajm2/oracle-qm3q/oracle-qbqf are all closed (except deliberately-deferred defense-in-depth), then CLOSE the epic shells; (2) README honesty pass — rewrite the false Instant-Client claims (README \"bundle Oracle Instant Client\", \"requires Instant Client at runtime\", hedged live-tool language) AND adopt oraclemcp's discipline: plsql-mcp is governed/least-privilege/guarded (it ships MORE guarded-write tools than oraclemcp), NOT \"read-only\"/\"safe-by-construction\"; never claim \"audited deps\"/\"stable Rust\"/\"1.0-frozen\"; (3) truth-up plan.md §9.2.6: the 3 named L2 crates (plsql-sqlsem/-flow/-facts) do not exist as crates — the capability is folded into plsql-ir as flow-STATE types; reconcile the doc to the model that actually exists (the matching BUILD of the emitted-fact projection is Phase G); (4) retire the inert plsql-parser-java crate (publish=false, zero dependents, ANTLR backend is the tournament winner) — exact `git rm` + workspace-member removal with founder sign-off per RULE 1; (5) AGENTS.md rewrite: the async-runtime rule (\"Tokio for CLIs/daemon/I/O\") and \"sync-first library APIs\" rule and the stable-toolchain assumption all change (asupersync; sync-first stays the default for the OFFLINE engine, async exception for live-DB paths); (6) reactivate oracle-ublu (Ship) and write the release-readiness checklist.\nDEPS: none (root). The honesty-grep gate (Phase X / idea 8) must land AFTER/WITH Phase 0 so it does not fail on the stable strings Phase 0 is removing.\nDoD: clean non-closed backlog; README + AGENTS.md match the converged reality and the honesty discipline; plan.md §9.2.6 reconciled; java crate gone; release epic active + checklist written.","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:25.568673934Z","created_by":"durakovic","updated_at":"2026-06-25T07:45:51.792606807Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.568673934Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.1","title":"A.1 Verify + close the stale open hunt-epics (ajm2/qm3q/qbqf)","description":"oracle-ajm2 / oracle-qm3q / oracle-qbqf are open epic SHELLS whose children are all closed except deliberately-deferred defense-in-depth (oracle-qm3q.8, oracle-ajm2.5, oracle-qbqf.4 — these are re-homed elsewhere in this program). Verify each epic's children via `br`, then close the three shells with a rationale.\nACCEPTANCE: ajm2/qm3q/qbqf closed; the deferred children remain tracked under this program (D / E), not orphaned.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:57:44.051856483Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:44.051856483Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.1","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.051856483Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.2","title":"A.2 README honesty pass + governed/least-privilege discipline","description":"Rewrite the false Instant-Client claims that become wrong after Phase C: README \"bundle Oracle Instant Client under Oracle Free Use Terms\" (~line 71), \"the live-db feature ... requires Instant Client at runtime\" (~line 343), and the hedged live-tool language (~111-112,303). ADOPT oraclemcp's honesty discipline (plsql-mcp inherits the shared guard ladder and ships MORE guarded-write tools than oraclemcp): position it as governed / least-privilege / guarded, NOT \"read-only\" / \"safe by construction\"; never claim \"independently-audited dependencies\" / \"stable Rust\" / \"1.0-frozen API\" for the nightly/asupersync/oracledb stack; do not claim \"tamper-evident audit\" until Phase E idea-30 wires it. Also fix the describe_object->describe_table naming drift.\nACCEPTANCE: README claims match the converged reality; honesty-grep gate (Phase X) passes on the result.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:57:44.164903892Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:44.164903892Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.2","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.164903892Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.3","title":"A.3 Truth-up plan.md §9.2.6 (flow-state model; the build is Phase G)","description":"plan.md §5/§9.2.5-7 name three L2 crates (plsql-sqlsem/-flow/-facts) that do NOT exist as crates; the capability is folded into plsql-ir as flow-STATE types (only FlowUnknownFact is exported as a normalized fact). Reconcile §9.2.6 to describe the model that actually exists, and record the emitted-fact FactStore as the intended end-state whose BUILD is Phase G (idea 29). This is the documentation half of S1; it must NOT rubber-stamp the gap as if the flow-state model were the final design.\nACCEPTANCE: plan.md §9.2.6 matches the code; the emitted-fact end-state is recorded as a tracked Phase-G deliverable.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:57:44.276516253Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:44.276516253Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.3","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.276516253Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.4","title":"A.4 Retire the inert plsql-parser-java crate (RULE 1 sign-off)","description":"plsql-parser-java is the parser-backend tournament LOSER: publish=false, zero dependents, never produces a real AST by design (the ANTLR backend plsql-parser-antlr is the winner). Retiring it is pure subtraction. EXECUTION REQUIRES founder sign-off of the exact `git rm -r crates/plsql-parser-java` + removal of the workspace-member line in root Cargo.toml, per AGENTS.md RULE 1 (no deletion without explicit in-session approval). Do NOT delete until that approval is given in-session.\nACCEPTANCE: crate removed; workspace builds; no dangling references; the deletion command + approval recorded.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:57:44.396271133Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:44.396271133Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.4","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.396271133Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.5","title":"A.5 AGENTS.md async/sync-first/toolchain rewrite","description":"AGENTS.md currently mandates \"Async runtime: Tokio for CLIs/daemon/I/O\" and \"Public library APIs stay sync-first\". The convergence supersedes the Tokio rule (asupersync) and adds a documented async exception for the live-DB paths — BUT sync-first stays the DEFAULT for the offline engine (parse/IR/depgraph/lineage/SAST). Rewrite the async-runtime + toolchain sections to match.\nACCEPTANCE: AGENTS.md describes asupersync + the sync-first-default/async-for-live-DB rule + the nightly toolchain.\nDEPS: 0.1 (toolchain truth).","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:57:44.509719921Z","created_by":"durakovic","updated_at":"2026-06-23T20:57:44.760116884Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.5","depends_on_id":"oracle-plsql-converge-0lnu.7.1","type":"blocks","created_at":"2026-06-23T20:57:44.759472725Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.8.5","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.509719921Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.8.6","title":"A.6 Reactivate oracle-ublu + write the release-readiness checklist","description":"oracle-ublu (Ship/release epic) is reactivated by this program. Write the release-readiness checklist it gates on, where EACH line maps to a named gate or bead ID (auditable, not prose): all phase epics closed; the 9-stage USR gate green (X.4a); coverage_index floor seeded (Ship.3) + tripwire green (X.3); CHANGELOG coverage_index row; release.yml ships plsql-depgraph+plsql-mcp+plsql +checksums (Ship.1); ghcr + MCP-registry publish on v* (Ship.2); boundary lint (X.11) + honesty-grep (X.12) + version-skew (X.13) green.\nACCEPTANCE: ublu carries a checklist where every line cites the gate/bead that satisfies it; no unmapped prose item.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:57:44.617565817Z","created_by":"durakovic","updated_at":"2026-06-23T21:13:58.260315457Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.8.6","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"parent-child","created_at":"2026-06-23T20:57:44.617565817Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9","title":"Phase B — Adopt the 0.4.0 spine + asupersync runtime + async dispatcher (ONE ATOMIC UNIT)","description":"ROLE: the convergence watershed. Bumping plsql-mcp onto the shipped oraclemcp 0.4.0 spine FORCES the asupersync runtime + an async dispatcher into the SAME unit — they compile together or not at all. After this phase the server compiles and serves; the live-DB tool arms are still gated (live wiring is Phase D).\nWHY (verified against oraclemcp 0.4.0 source): the 0.4.0 `OracleMcpServer` builds its asupersync runtime AT CONSTRUCTION; `ToolDispatch::dispatch` is now an object-safe `fn dispatch(&self, cx:&Cx, ctx:DispatchContext, name, args) -> DispatchFuture` (returns a boxed future; NOT literally `async fn`); `serve_stdio` is no longer `async`. plsql-mcp binds its engine through `ToolDispatch`, so its sync `dispatch_tool`/`handle_tools_call` must be rewritten. Spine delta 0.1.0->0.4.0: `oraclemcp-error` source/public-API unchanged (metadata + snapshot only); `oraclemcp-guard` surface unchanged but classifier STRICTER (more statements classify Guarded/Forbidden — plsql-mcp guard tests must be re-baselined); `oraclemcp-core` genuinely BREAKING (the dispatch + serve_stdio changes above).\nSCOPE (~6 sub-beads): (a) add direct deps oraclemcp-db=0.4.0 + oraclemcp-audit=0.4.0 (+ later -telemetry if observability) and bump -core/-error/-guard 0.1.0->0.4.0 (transitively pulls oracledb 0.5.0 + asupersync + nightly); (b) bootstrap an asupersync RuntimeBuilder at server construction; (c) the serve-entry block_on shim that drives the async DispatchFuture on that runtime (the ONE blessed block_on — the per-round-trip DB block_on stays forbidden); (d) rewrite ToolDispatch impl + dispatch_tool + handle_tools_call to the async signature threading &Cx; (e) re-baseline plsql-mcp guard-dependent tests for stricter classification; (f) adopt RequestBudget + ReadPathCaps/narrow_to_read_path types. Re-validate the one-way boundary.\nDEPS: Phase 0 (nightly).\nDoD: workspace compiles + `serve` runs on the 0.4.0 spine + asupersync runtime; live arms still return RuntimeStateRequired; guard tests green at the stricter baseline; boundary lint green; a post-async dispatch regression test (Phase X) confirms identical dispatch behavior.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-06-23T20:56:25.667206704Z","created_by":"durakovic","updated_at":"2026-06-23T20:56:26.445084076Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9","depends_on_id":"oracle-plsql-converge-0lnu","type":"parent-child","created_at":"2026-06-23T20:56:25.667206704Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9","depends_on_id":"oracle-plsql-converge-0lnu.7","type":"blocks","created_at":"2026-06-23T20:56:26.444586857Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.1","title":"B.1 Add direct deps (oraclemcp-db/-audit =0.4.0) + bump spine 0.1.0->0.4.0","description":"In crates/plsql-mcp/Cargo.toml bump oraclemcp-core/-error/-guard 0.1.0->0.4.0 AND add new direct deps oraclemcp-db=\"=0.4.0\" + oraclemcp-audit=\"=0.4.0\" (the binary does not depend on them today). This transitively pulls oracledb 0.5.0 + asupersync + nightly. Delta to expect: -error source/public-API unchanged (free); -guard surface unchanged but classifier stricter (B.5 handles tests); -core BREAKING (B.2-B.4 handle it).\nACCEPTANCE: Cargo.lock resolves the 0.4.0 spine + oraclemcp-db/-audit; `cargo check` surfaces ONLY the expected -core breakage (the dispatcher/serve_stdio changes), nothing else.\nDEPS: Phase 0.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:21.351167035Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:21.351167035Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.1","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.351167035Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.2","title":"B.2 Bootstrap an asupersync RuntimeBuilder at server construction","description":"The 0.4.0 OracleMcpServer builds its asupersync runtime AT CONSTRUCTION. plsql-mcp's serve path is sync std::io today; stand up a single asupersync RuntimeBuilder owned by the server so the async DispatchFuture can be driven. Mirror oraclemcp's pattern (server.rs).\nACCEPTANCE: the server constructs with an owned asupersync runtime; `serve` still accepts stdio frames.\nDEPS: B.1.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:21.467745173Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.133507953Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.2","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.467745173Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.2","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T20:59:22.132971674Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.3","title":"B.3 Serve-entry block_on shim (the ONE blessed block_on)","description":"At the serve entry, drive each request's async DispatchFuture to completion via block_on on the owned asupersync runtime (exactly oraclemcp's serve_stdio pattern). This boundary block_on is the ONLY permitted one; the per-round-trip DB block_on stays FORBIDDEN (the boundary lint / discipline). Document it with a `// block-on-boundary:` marker.\nACCEPTANCE: requests are driven through the async dispatch; no per-round-trip block_on anywhere in the DB path.\nDEPS: B.2.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T20:59:21.587097025Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.274035338Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.3","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.587097025Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.3","depends_on_id":"oracle-plsql-converge-0lnu.9.2","type":"blocks","created_at":"2026-06-23T20:59:22.273405480Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.4","title":"B.4 Rewrite ToolDispatch + dispatch_tool + handle_tools_call to async (&Cx)","description":"THE highest-risk bead. 0.4.0 ToolDispatch::dispatch is `fn dispatch(&self, cx:&Cx, ctx:DispatchContext, name, args) -> DispatchFuture` (object-safe; returns a boxed future; NOT `async fn`). plsql-mcp's dispatch_tool (dispatch.rs, sync free fn) and handle_tools_call (mcp_protocol.rs, sync) must be rewritten to the async signature, threading &Cx + the new DispatchContext, returning DispatchFuture. The offline/static tool arms stay synchronous internally (wrapped in a ready future); the live-DB arms become genuinely async (they will execute once Phase D wires the connection — until then they still return RuntimeStateRequired).\nACCEPTANCE: workspace compiles on the 0.4.0 core; `serve` dispatches every advertised tool; a post-async dispatch REGRESSION test (Phase X) proves identical behavior for the offline tools.\nDEPS: B.2, B.3.","status":"open","priority":0,"issue_type":"task","created_at":"2026-06-23T20:59:21.718082852Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.588415736Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.4","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.718082852Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.4","depends_on_id":"oracle-plsql-converge-0lnu.9.2","type":"blocks","created_at":"2026-06-23T20:59:22.414827053Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.4","depends_on_id":"oracle-plsql-converge-0lnu.9.3","type":"blocks","created_at":"2026-06-23T20:59:22.587765818Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.5","title":"B.5 Re-baseline plsql-mcp guard-dependent tests (stricter classifier)","description":"oraclemcp-guard 0.4.0's classifier is stricter (more statements classify Guarded/Forbidden; e.g. the schema-qualified-UDF path now fails closed to Guarded). plsql-mcp's guard-dependent tests will shift. Re-baseline them to the stricter, fail-closed expectations — confirming the change is MORE denials (never fewer), preserving the fail-closed posture.\nACCEPTANCE: guard tests green at the 0.4.0 baseline; no test was relaxed to admit a previously-denied statement.\nDEPS: B.4.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T20:59:21.845685556Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.739154230Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.5","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.845685556Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.5","depends_on_id":"oracle-plsql-converge-0lnu.9.4","type":"blocks","created_at":"2026-06-23T20:59:22.738138212Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-plsql-converge-0lnu.9.6","title":"B.6 Adopt RequestBudget + ReadPathCaps/narrow_to_read_path types","description":"0.4.0 oraclemcp-core ships RequestBudget (over asupersync Budget) and ReadPathCaps + narrow_to_read_path + PrivilegedEffect. Bring these types into plsql-mcp's dispatch context now (free types). Actually APPLYING them is later: RequestBudget into the query timeout = Phase D; narrow_to_read_path on the read loaders = Phase C. This task just makes the types available + threads the budget/caps through the dispatch context.\nACCEPTANCE: RequestBudget + ReadPathCaps reachable in plsql-mcp dispatch; compiles.\nDEPS: B.1.","status":"open","priority":3,"issue_type":"task","created_at":"2026-06-23T20:59:21.984191067Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:22.880241904Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-plsql-converge-0lnu.9.6","depends_on_id":"oracle-plsql-converge-0lnu.9","type":"parent-child","created_at":"2026-06-23T20:59:21.984191067Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-plsql-converge-0lnu.9.6","depends_on_id":"oracle-plsql-converge-0lnu.9.1","type":"blocks","created_at":"2026-06-23T20:59:22.879462095Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-prx","title":"PLSQL-ENG-000 — **Layer 0 skeleton only:** create `plsql-engine` crate skeleton + public module structure with type stubs so consumer crates can compile against the contracts. Implementation beads ENG-001..005 live in §10A.3 (Layer 2.5)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-12T15:54:38.412590834Z","closed_at":"2026-05-12T15:54:38.412305495Z","close_reason":"Implemented","external_ref":"PLSQL-ENG-000","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:analysis-engine","effort:S","layer:2-5","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-prx","depends_on_id":"oracle-m80","type":"blocks","created_at":"2026-05-12T14:10:53.302579522Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-pxp","title":"PLSQL-PARSE-011 — Author visitor / walker trait in `src/ast/visit.rs`","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-13T09:38:16.765963839Z","closed_at":"2026-05-13T09:38:16.765679292Z","close_reason":"Visitor trait + walk module in crates/plsql-parser/src/visit.rs","external_ref":"PLSQL-PARSE-011","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:parser-core","effort:M","layer:1","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-pxp","depends_on_id":"oracle-gpq","type":"blocks","created_at":"2026-05-12T14:11:04.244710801Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-q2o8","title":"PLSQL-CICD-005A — Hard safety guard: refuse in-place DDL verification unless `--dangerously-verify-in-place` + interactive confirmation of connected schema name","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-17T07:35:45.645556505Z","closed_at":"2026-05-17T07:35:45.645293087Z","close_reason":"VERIFIED COMPLETE. crates/plsql-cicd/src/verify.rs confirm_in_place_verification + InPlaceDecision + VerifyError::InPlaceConfirmationMismatch. Two independent signals required: --dangerously-verify-in-place flag AND operator retypes connected schema name verbatim (case-sensitive, CRLF-tolerant). Injectable reader/writer => 7 unit tests PASS: flag-absent short-circuits w/o prompt, exact match Confirmed, CRLF match Confirmed, mismatch/case-mismatch/empty -> Mismatch err, end-to-end seam test proves unconfirmed stays InPlaceVerificationRefused by VerifyOptions. Re-ran: clippy -D warnings clean; 101 unit + gate-off pass, 0 fail. Wires m941's allow_in_place seam. Commit pending.","external_ref":"PLSQL-CICD-005A","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:change-impact","component:release-assurance","effort:S","layer:5","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-q2o8","depends_on_id":"oracle-m941","type":"blocks","created_at":"2026-05-12T14:21:44.936036745Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} @@ -459,7 +540,7 @@ {"id":"oracle-qbqf.1","title":"tables_after drops all but first table in legacy comma-joined FROM lists (missing Reads edges)","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\n\n### crates/plsql-ir/src/dml_edges.rs:297 — verdict=keep, severity=medium\n**Impact:** A legacy Oracle comma join (FROM a, b, c) — ubiquitous in real PL/SQL — produces a Reads dependency-graph edge only on the FIRST table; the read dependency on every sibling table is silently dropped from the dependency graph, lineage, and impact analysis with no diagnostic emitted.\n**Fix:** In tables_after, after pushing each [schema.]table token, skip an optional per-table alias and surrounding whitespace; if the next non-whitespace byte is a top-level comma (parenthesis-depth 0, to avoid splitting TABLE(f(a,b)) or parenthesised sub-selects), advance past it and loop to read the next sibling table, repeating until the next byte is not a comma — mirroring sql_resolve.rs:287-293 and reusing sql_columns.rs::split_top_level_commas depth logic. Restrict the comma-continuation to the FROM keyword (and JOIN already gets per-clause occurrences); INTO/UPDATE/USING write/merge targets are single-target in normal DML and should keep breaking after the first table. Add a regression test asserting `FROM emp a, dept b` yields Reads of both EMP and DEPT and `FROM a, b, c` yields A, B, C.\n\n## Acceptance\n- [ ] Root-cause fix + regression test (keeps).\n- [ ] cargo test/clippy green.\n- [ ] No regression.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-03T07:10:22.074536765Z","created_by":"durakovic","updated_at":"2026-06-03T07:17:10.118099063Z","closed_at":"2026-06-03T07:17:10.117860574Z","close_reason":"dml_edges tables_after now traverses a top-level comma-separated FROM list (skipping per-table aliases), mirroring sql_resolve — a legacy 'FROM emp a, dept b' / 'FROM a, b, c' yields a Read edge for every sibling table, not just the first. Restricted to the FROM keyword (INTO/UPDATE/USING are single-target; JOIN gets per-clause occurrences). +regression test.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-03-r13","keep","plsql-ir"],"dependencies":[{"issue_id":"oracle-qbqf.1","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.074536765Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qbqf.2","title":"Mask string literals before keyword scans in dml_edges/sql_resolve table-access extractors","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\n\n### crates/plsql-ir/src/dml_edges.rs:297 — verdict=keep, severity=medium\n**Impact:** A DML statement carrying a SQL clause keyword (FROM/JOIN/UPDATE/USING) as a whole word inside a string literal — common in audit/log message strings, error text, and dynamic-SQL builder fragments that lower to static DML — injects a phantom Reads/Writes dependency edge (and DependencyEdge fact) into the production dependency graph, polluting lineage/impact analysis; a schema-qualified keyword-in-literal mints a phantom cross-schema write target that can drive a spurious dependency cycle or false cross-schema-write signal.\n**Fix:** Mask single-quoted (and Oracle q-quoted) string-literal contents before the keyword scans in the two IR extractor families, mirroring fact_emit. Make a literal-masking helper crate-visible (or reuse/extend fact_emit::mask_string_literals at fact_emit.rs:523) and use a SPACE filler — not `_`, which is_ident_byte treats as identifier (dml_edges.rs:330) and would fuse the masked literal — so an embedded keyword loses its whole-word/identifier neighbours and is rejected by prev_ok/next_ok. Build a masked buffer once in accesses_from_sql (dml_edges.rs:166) and use it for both keyword detection and identifier slicing (real table names lie outside literals, so they survive masking verbatim); apply the same masking in sql_resolve.rs before tables_after_keyword (line 180) and delete_target (line 30\n\n## Acceptance\n- [ ] Root-cause fix + regression test (keeps).\n- [ ] cargo test/clippy green.\n- [ ] No regression.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-03T07:10:22.290224399Z","created_by":"durakovic","updated_at":"2026-06-03T07:17:10.472906528Z","closed_at":"2026-06-03T07:17:10.472660479Z","close_reason":"dml_edges::accesses_from_sql and sql_resolve::resolve_sql now mask single-quoted string-literal CONTENTS (reusing fact_emit::mask_string_literals, now pub(crate)) before the clause-keyword scan, so a FROM/INTO/JOIN/USING keyword buried in a literal ('failed to INSERT INTO orders' / 'read FROM cache') can no longer mint a phantom table access. Masking preserves byte length so name slices stay offset-aligned. +regression tests in both crates.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-03-r13","keep","plsql-ir"],"dependencies":[{"issue_id":"oracle-qbqf.2","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.290224399Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qbqf.3","title":"Make cyclomatic() string/comment-aware so branch keywords in literals and comments aren't counted","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\n\n### crates/plsql-mcp/src/plsql_analyze.rs:193 — verdict=keep, severity=low\n**Impact:** An agent calling the plsql_analyze tool gets an inflated per-file cyclomatic complexity for any PL/SQL file whose string literals (error messages, dynamic-SQL fragments) or comments contain words like IF/AND/OR/WHEN/FOR/WHILE/CASE/ELSIF — extremely common — so the reported number is too high (never too low). It is an advisory metric, not a safety gate, so nothing breaks functionally; only the reported figure is wrong.\n**Fix:** Neutralize Oracle string literals ('...', treating '' as escaped quote) and comments (-- ... \\n, /* ... */) before tokenizing, consistent with the crate's other keyword scanners. Cheapest path: add a small self-contained pre-pass in plsql_analyze.rs that blanks literal/comment bodies, then run the existing split/count loop over the cleaned copy (avoids cross-module coupling); or make query.rs `strip_sql_comments` pub(crate) and additionally blank single-quoted literal contents (strip_sql_comments alone leaves literal bodies intact). Add regression tests: cyclomatic(\"BEGIN v := 'IF a AND b OR c'; END;\") == 1; cyclomatic(\"BEGIN NULL; -- WHILE FOR WHEN\\nEND;\") == 1; cyclomatic(\"BEGIN NULL; /* ELSIF CASE */ END;\") == 1.\n\n## Acceptance\n- [ ] Root-cause fix + regression test (keeps).\n- [ ] cargo test/clippy green.\n- [ ] No regression.","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-06-03T07:10:22.494604032Z","created_by":"durakovic","updated_at":"2026-06-03T07:17:10.859026578Z","closed_at":"2026-06-03T07:17:10.858724819Z","close_reason":"cyclomatic() now blanks string literals + line/block comments before tokenizing (blank_strings_and_comments), so a branch keyword inside a literal or comment ('IF a AND b' / -- WHILE) no longer inflates the complexity metric. +regression test.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-03-r13","keep","plsql-mcp"],"dependencies":[{"issue_id":"oracle-qbqf.3","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.494604032Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} -{"id":"oracle-qbqf.4","title":"Make cross-schema guard Oracle-faithful on quoted-identifier case (stop folding parsed target) before live executor is wired","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\nDEFERRED (2026-06-09): the bead's own fix note says 'land WITH the live executor wiring, NOT before' — run_execute_approved has NO production caller (dispatch.rs has no live executor). Folding quoted-identifier-case logic into the cross-schema guard before the executor exists would add untested, unexercised guard behavior. Land together with the live write executor. Not blocking.","notes":"DEFERRED (calibration: defense-in-depth, do NOT ship before the live-DB executor is wired). run_execute_approved has no production caller today (dispatch returns RuntimeStateRequired); the uniform case-fold is internally consistent and the system has no representation of a case-sensitive principal. Fix (stop folding the parsed quoted target + case-sensitive cross-schema compare) lands WITH the executor-wiring work, where it becomes reachable. Tracked, non-blocking.","status":"deferred","priority":3,"issue_type":"bug","created_at":"2026-06-03T07:10:22.709058615Z","created_by":"durakovic","updated_at":"2026-06-09T07:29:32.440681428Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-03-r13","plsql-mcp"],"dependencies":[{"issue_id":"oracle-qbqf.4","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.709058615Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-qbqf.4","title":"Make cross-schema guard Oracle-faithful on quoted-identifier case (stop folding parsed target) before live executor is wired","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\nDEFERRED (2026-06-09): the bead's own fix note says 'land WITH the live executor wiring, NOT before' — run_execute_approved has NO production caller (dispatch.rs has no live executor). Folding quoted-identifier-case logic into the cross-schema guard before the executor exists would add untested, unexercised guard behavior. Land together with the live write executor. Not blocking.","notes":"DEFERRED (calibration: defense-in-depth, do NOT ship before the live-DB executor is wired). run_execute_approved has no production caller today (dispatch returns RuntimeStateRequired); the uniform case-fold is internally consistent and the system has no representation of a case-sensitive principal. Fix (stop folding the parsed quoted target + case-sensitive cross-schema compare) lands WITH the executor-wiring work, where it becomes reachable. Tracked, non-blocking.","status":"deferred","priority":3,"issue_type":"bug","created_at":"2026-06-03T07:10:22.709058615Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:26.875642834Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-03-r13","plsql-mcp"],"dependencies":[{"issue_id":"oracle-qbqf.4","depends_on_id":"oracle-plsql-converge-0lnu.11.5","type":"blocks","created_at":"2026-06-23T20:59:26.875009035Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-qbqf.4","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.709058615Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qbqf.5","title":"Document plsqld serial/no-timeout posture and add a connection read timeout","description":"Source: verify-and-hunt re-hunt + calibration (round 13).\n\n### crates/plsql-store/src/bin/plsqld.rs:268 — verdict=defense-in-depth, severity=low\n**Impact:** None today: no shipping component connects to plsqld.sock, so the serial accept loop cannot starve any real consumer. The only residual is robustness/documentation hygiene — if a future client-side wrapper is ever written and a client stalls mid-line or holds the socket idle, that one connection would block the loop, but no such caller exists and the serial-by-design posture is the codebase's documented intent.\n**Fix:** Treat as defense-in-depth, not a medium bug. (1) Mirror the sibling daemons: add a comment at the accept loop scoping the serial/no-timeout behavior as intentional single-stream local-transport design (matching plsql-doc/src/serve.rs:164-167 and plsql-mcp/src/tcp.rs:13-14,139-141), so future maintainers/callers can anticipate it. (2) Add a defensive read timeout before constructing the BufReader: `stream.set_read_timeout(Some(Duration::from_secs(30)))?;` — a WouldBlock/TimedOut from reader.lines() then hits the existing `else { break }` arm and ends that connection instead of holding the socket open. Defer the thread-per-connection/Arc change until a real multi-client UDS consumer is actually written (none exists today).\n\n## Acceptance\n- [ ] Root-cause fix + regression test (keeps).\n- [ ] cargo test/clippy green.\n- [ ] No regression.","notes":"DEFERRED (calibration: defense-in-depth, document/harden later). plsqld accept loop is serial with no read timeout — a slow/idle client blocks the daemon. plsqld is a dev/local store daemon, NOT the published oraclemcp artifact, so this is non-blocking for publish. Harden (per-connection read timeout + concurrent accept) when the daemon's role expands. Tracked.","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-06-03T07:10:22.921338052Z","created_by":"durakovic","updated_at":"2026-06-09T07:44:17.188023505Z","closed_at":"2026-06-09T07:44:17.187784777Z","close_reason":"DONE (commit 9871ddf). plsqld serial accept loop now sets a per-connection read timeout (30s default, PLSQLD_READ_TIMEOUT_MS test knob) so a stalled/idle client is reaped via the existing break arm instead of blocking the loop; + scoping comment + an end-to-end regression test (verified fails without the fix). cargo test -p plsql-store green, clippy clean.","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["defense-in-depth","hunt-2026-06-03-r13","plsql-store"],"dependencies":[{"issue_id":"oracle-qbqf.5","depends_on_id":"oracle-qbqf","type":"parent-child","created_at":"2026-06-03T07:10:22.921338052Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qcma","title":"PLSQL-SAST-010 — Implement QUAL001 (`WHEN OTHERS THEN NULL`) + tests","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-16T06:07:13.012989320Z","closed_at":"2026-05-16T06:07:13.012696661Z","close_reason":"Shipped QUAL001 (Qual001WhenOthersThenNull) in new crates/plsql-sast/src/rules_qual.rs — fact-backed on FactKind::ExceptionHandler (scope==others && body_class==noop), High confidence (definitive syntactic fact), remediation hint. Non-theater: positive + named-noop-negative + others-with-body-negative + case-insensitive + R13 skip-on-no-facts tests (6 total green). No rules.rs touched (separate file, 2 surgical lib.rs lines). clippy clean.","external_ref":"PLSQL-SAST-010","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:sast-engine","effort:S","layer:3","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-qcma","depends_on_id":"oracle-e8q","type":"blocks","created_at":"2026-05-12T14:18:57.026918458Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qhr5","title":"plsql-mcp MCP-registry listing (server.json OCI + OIDC publish-mcp workflow)","description":"In the plsql-intelligence repo: server.json (name io.github.MuhDur/plsql-mcp, title 'PL/SQL Intelligence', description leading with the intelligence differentiation + the unofficial/not-Oracle disclaimer; packages:[{registryType:oci, identifier:ghcr.io/muhdur/plsql-mcp:, transport stdio}] — NO version/registryBaseUrl fields per the OCI validator). .github/workflows/publish-mcp.yml (OIDC github-oidc login, dispatch-only). Run AFTER the image is pushed+public. Depends on R1. Verify live via the registry API (status=active). Same DCG traps: gh --field not -f.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-06-09T07:21:55.088126640Z","created_by":"durakovic","updated_at":"2026-06-09T08:01:17.685102512Z","closed_at":"2026-06-09T08:01:17.684454535Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-qhr5","depends_on_id":"oracle-b41w","type":"blocks","created_at":"2026-06-09T07:21:55.701527577Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-qhr5","depends_on_id":"oracle-ck6k","type":"blocks","created_at":"2026-06-09T07:21:56.081638430Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} @@ -489,7 +570,7 @@ {"id":"oracle-qm3q.5","title":"plsql-mcp create_or_replace: whitespace-tokenize classify_kind/parse_target_schema (cross-schema write bypass)","description":"Source: verify-and-hunt + strict ground-truth calibration workflow (2026-06-02).\n\n### Site crates/plsql-mcp/src/create_or_replace.rs:229 — CONFIRMED DEFECT, severity=high\n**Impact:** An agent connected as BILLING can submit `CREATE OR REPLACE PACKAGE␣␣BODY ANALYTICS.INVOICE_PKG ...` (double space / tab / newline between PACKAGE and BODY) with target_schema=\"\" and operator_typed_schema=None, and run_execute_approved approves a cross-schema write into ANALYTICS as confirmed=true SameSchema(BILLING) — the operator-typed-schema confirmation control is silently skipped, so a package body is deployed into a foreign schema without the destination name ever being typed.\n**Evidence:** crates/plsql-mcp/src/create_or_replace.rs:183-191 classify_kind loops SUPPORTED_KINDS and matches via `rest.strip_prefix(kind)` where kind==\"PACKAGE BODY\" is a single-ASCII-space literal; `PACKAGE BODY` fails that prefix and falls through to the single-word \"PACKAGE\" branch (after.starts_with(whitespace) passes). create_or_replace.rs:229 `rest.strip_prefix(kind.as_str())` strips only \"PACKAGE\", so the name token becomes \"BODY\" (no dot) → returns Ok(None). execute_approved.rs:130-133 maps None to principal_schema; :138-139 skips the agreement check when caller_target.is_empty(); :146-150 calls require_cross_schema_confirmation(BILLING,BILLING,None) which (cross_schema.rs:98-105) returns SameSchema/confirmed. Reproduced end-to-end with a tests/ integration harness using the crate public API (cargo test -p plsql-mcp passed all 3): double-space classify = Ok(\"PACKAGE\"); parse = Ok(None); ru\n**Repro/trigger:** Trigger: malicious_ddl = \"CREATE OR REPLACE PACKAGE BODY ANALYTICS.INVOICE_PKG AS\\nBEGIN\\n NULL;\\nEND INVOICE_PKG;\\n\" (two spaces). 1) run_create_or_replace DryRun mints token \"tok-evil\" (classify accepts it as PACKAGE, no error). 2) run_execute_approved{connection:\"billing-dev\", token:\"tok-evil\", ddl_bytes:malicious_ddl, principal_schema:\"BILLING\", target_schema:\"\", operator_typed_schema:None} → Ok(plan) with plan.cross_schema.confirmed==true, decision SameSchema(BILLING), plan.ddl_bytes still naming ANALYTICS. Oracle's lexer collapses the whitespace run so it compiles a PACKAGE BODY into ANALYTICS. Control (single space) is correctly refused with ConfirmationMissing{target:\"ANALYTICS\"}. \n**Suggested fix:** Make classify_kind and parse_target_schema whitespace-tolerant: split the post-\"CREATE OR REPLACE\" remainder into head tokens via split_whitespace(), compare the joined upper-cased first 1-2 tokens against SUPPORTED_KINDS preferring the two-token form (\"PACKAGE BODY\"/\"TYPE BODY\") before the one-token form, and advance past the matched token count (not via single-space strip_prefix). Equivalently fail-closed: reject any CREATE OR REPLACE header whose kind keywords are separated by anything other than a single ASCII space (UnsupportedKind), forcing canonical DDL. Add regression tests for `PACKAGE BODY` (two spaces), `PACKAGE\\tBODY`, `PACKAGE\\nBODY` with a schema-qualified name asserting classify_kind==\"PACKAGE BODY\" and parse_target_schema==Some(\"ANALYTICS\"), plus an execute_approved test asserting ConfirmationMissing when no operator schema is typed.\n\n## Acceptance criteria\n- [ ] Root cause fixed in production code (not just the symptom).\n- [ ] A regression test reproduces the defect before the fix (fails) and passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; `cargo fmt` (oraclemcp-* only).\n- [ ] No behavior regression on existing tests / adversarial corpus.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-06-02T00:33:12.138724158Z","created_by":"durakovic","updated_at":"2026-06-02T05:15:24.196170785Z","closed_at":"2026-06-02T05:15:24.195938527Z","close_reason":"Rewrote classify_kind + parse_target_schema to tokenize the DDL header on whitespace RUNS (split_whitespace) instead of literal single-space strip_prefix. PACKAGE BODY / TYPE BODY now survive tabs/multiple-spaces/newlines between the two words, so the kind suffix and the schema-qualified owner are no longer dropped — closing the cross-schema write-confirmation bypass (CREATE OR REPLACE PACKAGEBODY OWNER.PKG previously classified as PACKAGE with target_schema=None). Two-word kinds tried before one-word, robust to SUPPORTED_KINDS order. Regression test two_word_kind_survives_arbitrary_whitespace added (5 separators + qualified-name spacing). 14 create_or_replace tests + full plsql-mcp suite green; clippy -D warnings clean. No cargo fmt (plsql-mcp pre-existing).","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","plsql-mcp"],"dependencies":[{"issue_id":"oracle-qm3q.5","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.138724158Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qm3q.6","title":"plsql-ir split_statements/strip_comments: make string-literal aware (; inside literal mis-splits)","description":"Source: verify-and-hunt + strict ground-truth calibration workflow (2026-06-02).\n\n### Site crates/plsql-ir/src/stmt.rs:196 — CONFIRMED DEFECT, severity=high\n**Impact:** On the source-slice fallback path (used when ANTLR yields no body statements), a routine body containing a string literal with embedded `;` or block keywords gets shredded: dependency/lineage analysis fabricates Read/Write edges to tables that the code never touches (proven: GHOST_TAB Write from a pure string assignment), and real statements can be silently dropped (proven: `v2 := 2` lost when a string contains the word BEGIN), corrupting the dep graph the product reports to users.\n**Evidence:** stmt.rs:196-243 split_statements walks `let chars: Vec = source.chars().collect();` matching consume_end_keyword (l208), consume_any_keyword([\"BEGIN\",\"IF\",\"LOOP\",\"CASE\"]) (l217), and `if c == ';' && depth == 0` (l227) — NO single-quote or q-quote handling anywhere; strip_comments (l300) handles only `--`/`/* */`, no strings, and runs AFTER the split in lower_statement_body (l147). Sibling recover.rs:73-135 explicitly skips q-quotes and single-quoted literals (with `''` escape) before its BEGIN/END/`;` logic. Empirical run via real plsql_ir public API (cargo test -p plsql-ir, throwaway test, removed; tree confirmed pristine):\n CASE1 \"v_sql := 'SELECT 1; SELECT 2';\" -> [0] Assignment{target:\"v_sql\", rhs_text:\"'SELECT 1\"} [1] Sql{Select, \"SELECT 2';\"}\n CASE2 \"v := 'BEGIN'; v2 := 2;\" -> 1 stmt: Unrecognized{UnterminatedBlock} (v2:=2 LOST)\n CASE3 \"EXECUTE IMMEDIATE 'INSERT INTO t VAL\n**Repro/trigger:** Input X = a routine body statement `v_audit := 'old value; DELETE FROM ghost_tab';` (or any of CASE1-4). Trace: lower_statement_body -> split_statements splits at the in-string `;` (depth stays 0, no string skip) -> classify(\"DELETE FROM ghost_tab';\") matches the DELETE verb -> Statement::Sql{Delete} -> extract_table_accesses -> accesses_from_sql(Delete) -> tables_after(...,\"FROM\") -> wrong output Y = TableAccess{table:\"GHOST_TAB\", access:Write}, a Write lineage edge to a table the code never executes against. CASE2 additionally yields Y = the entire body collapsing to one Unrecognized{UnterminatedBlock} with the trailing real statement lost. All reproduced live against plsql_ir::lower_state\n**Suggested fix:** In split_statements, before the consume_end_keyword/consume_any_keyword/`;` checks in the while-loop, add literal-skipping that mirrors recover.rs:73-135: (1) single-quoted literals — on `'`, copy chars to buffer until the closing `'`, honoring the doubled-quote `''` escape, with no keyword/`;`/depth logic inside; (2) Oracle q-quote literals `q'X..X'` / `nq'..` recognized at a token boundary (prev char non-identifier), mapping bracket delimiters `[]{}()<>` and otherwise self-closing. strip_comments should likewise skip string literals so a `--`/`/* */` sequence inside a string is preserved. Add regression tests for CASE1-4 asserting: (a) `v_sql := 'SELECT 1; SELECT 2';` => exactly one Assignment with rhs `'SELECT 1; SELECT 2'`; (b) `v := 'BEGIN'; v2 := 2;` => two statements with v2:=2 preserved; (c) the multi-statement EXECUTE IMMEDIATE literal stays one ExecuteImmediate; (d) extract_tab\n\n## Acceptance criteria\n- [ ] Root cause fixed in production code (not just the symptom).\n- [ ] A regression test reproduces the defect before the fix (fails) and passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; `cargo fmt` (oraclemcp-* only).\n- [ ] No behavior regression on existing tests / adversarial corpus.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-06-02T00:33:12.273136798Z","created_by":"durakovic","updated_at":"2026-06-02T05:38:43.672285348Z","closed_at":"2026-06-02T05:38:43.672011560Z","close_reason":"Made split_statements + strip_comments string-literal aware (and split_statements comment-aware, since it runs on the raw body BEFORE strip_comments). Added string_literal_end (single-quote with '' escape + Oracle q'X..X'/nq'X..X' alternative-quoting, token-start guarded, unterminated→EOF; mirrors plsql-parser-antlr::recover) and opaque_span_end (string OR line/block comment). split_statements copies opaque spans through verbatim so a ';' or BEGIN/END inside a literal/comment no longer splits or moves block depth; strip_comments skips literals so '--'/'/*' inside a string aren't stripped (corrupting SQL). 6 regression tests added (; in string/line-comment/block-comment, BEGIN/END in string, q-quote opacity, comment-markers-in-literal preserved). 261 plsql-ir + 94 plsql-sast green, clippy -D warnings clean. No cargo fmt (plsql-ir pre-existing).","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","plsql-ir"],"dependencies":[{"issue_id":"oracle-qm3q.6","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.273136798Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qm3q.7","title":"plsql-cicd gate.rs: fix rustdoc reason names + validate blocking_unknown_reasons against known set","description":"Source: verify-and-hunt + strict ground-truth calibration workflow (2026-06-02).\n\n### Site crates/plsql-cicd/src/gate.rs:32 — CONFIRMED DEFECT, severity=medium\n**Impact:** An operator who copies the rustdoc example writes `blocking_unknown_reasons = [\"OpaqueDynamicSql\", \"DbLinkReference\"]`; because the emitted names are `DynamicSqlOpaque`/`DbLinkRemoteObject`, the exact string match never fires and the deployment gate fails open silently — opaque dynamic SQL / db-link changesets pass the gate while the operator believes they are blocked.\n**Evidence:** gate.rs:32 docstring (the only in-source example of allowed values): `//! blocking_unknown_reasons = [\"OpaqueDynamicSql\", \"DbLinkReference\"]`. The matcher at gate.rs:322-337 does `unknown_reason_name(&u.reason) == blocked_reason.as_str()`. unknown_reason_name() at gate.rs:369-370 emits `R::DynamicSqlOpaque => \"DynamicSqlOpaque\"` and `R::DbLinkRemoteObject => \"DbLinkRemoteObject\"`. Canonical enum plsql-core/src/lib.rs:212-213: `DynamicSqlOpaque, DbLinkRemoteObject` — no `OpaqueDynamicSql` or `DbLinkReference` variant exists. rg confirms `OpaqueDynamicSql` appears ONLY at gate.rs:32; `DbLinkReference` exists only as an unrelated struct (plsql-symbols/src/db_link.rs:33) and FactKind/FactPayload (plsql-ir/src/fact.rs:51,117), never as a reason matcher string. parse_policy() (gate.rs:134-136) is `toml::from_str(...).map_err(...)` with no value validation; `#[serde(default, deny_unknown_fields\n**Repro/trigger:** Trigger: policy `blocking_unknown_reasons = [\"OpaqueDynamicSql\"]` (copied verbatim from gate.rs:32). Feed a prediction whose uncertainties contain `UnknownReason::DynamicSqlOpaque` (as predict.rs:471 actually emits). At gate.rs:327 unknown_reason_name returns \"DynamicSqlOpaque\" != \"OpaqueDynamicSql\" → filter().count()==0 → observed_count==0 → the `if observed_count > 0` guard at gate.rs:331 is false → no GateFailure::BlockingUnknownReasonHit pushed → allowed=true at gate.rs:342. Output Y: gate passes a changeset containing opaque dynamic SQL that the operator intended to block (silent fail-open). Disproof of any compile concern: this is a doc/string-value defect, not a build break; the match\n**Suggested fix:** Correct the docstring at gate.rs:32 to `blocking_unknown_reasons = [\"DynamicSqlOpaque\", \"DbLinkRemoteObject\"]`. To eliminate the silent fail-open on a future typo, add value validation in parse_policy() (or run_gate): expose a `fn all_reason_names() -> &'static [&'static str]` derived from the same arms as unknown_reason_name(), and after parsing reject any entry of blocking_unknown_reasons not in that set with GateError::Parse. Add a test asserting every UnknownReason variant's unknown_reason_name() output is accepted and that \"OpaqueDynamicSql\" is rejected, so the docstring and matcher cannot drift silently again.\n\n## Acceptance criteria\n- [ ] Root cause fixed in production code (not just the symptom).\n- [ ] A regression test reproduces the defect before the fix (fails) and passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; `cargo fmt` (oraclemcp-* only).\n- [ ] No behavior regression on existing tests / adversarial corpus.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-02T00:33:12.389003557Z","created_by":"durakovic","updated_at":"2026-06-02T06:17:08.447560594Z","closed_at":"2026-06-02T06:17:08.447321266Z","close_reason":"[done] implemented via parallel worktree workflow (commit b4c803fdbe), re-verified on main. Root-cause fixed two ways. (1) Corrected the only in-source example docstring at gate.rs:32 from the bogus [\"OpaqueDynamicSql\", \"DbLinkReference\"] to the actually-emitted [\"DynamicSqlOpaque\", \"DbLinkRemoteObject\"]. (2) Eliminated the silent fail-open on a future typo: parse_policy now validates every blocking_unknown_reasons entry against ALL_REASON_NAMES (the canonical UnknownReason variant names) and returns GateError::Parse for any unknown name, listing the valid set. ALL_REASON_NAMES is kept in lock-step with unknown_reason_name() by an exhaustive-match anti-drift test (all_reason_names_match_emitter) — a new UnknownReason variant becomes a compile/test failure rather than silent diverge","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","plsql-cicd"],"dependencies":[{"issue_id":"oracle-qm3q.7","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.389003557Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} -{"id":"oracle-qm3q.8","title":"oraclemcp-guard: wire SideEffectOracle::statement_purity (trigger/VPD walk) into classifier SELECT/DML; fix misleading comment","description":"DEFERRED (2026-06-09): the target file crates/oraclemcp-guard/src/classifier.rs now lives in the PUBLISHED, external MuhDur/oraclemcp repo (removed from this workspace in the E-4 depend-back) — not editable here. Also gated: it fires only 'when the engine binds a real SideEffectOracle', which the read-only oraclemcp server does not do. Implement in the oraclemcp repo + a 0.1.x bump if/when a live side-effect oracle is bound. Inapplicable to the current read-only surface.","notes":"PASS 2026-06-02 (partial): Root-cause-fixed the wiring gap and the false comment. statement_purity is now an actual production caller: classify_statement's Statement::Query arm extracts base objects via the new query_base_objects() walker (FROM/JOIN tables + CTE bodies + derived subqueries + set-op arms; CTE aliases excluded) and consults oracle.statement_purity(&base_objects), escalating a UDF-free SELECT to Guarded on an explicit ProvenSideEffecting verdict. Verified the headline regression FAILS before the fix (SELECT * FROM orders -> Safe) and PASSES after (-> Guarded) by temporarily neutralizing the consult. PARTIAL (not done) because the full fail-closed posture the bead ultimately wants — escalate on Unknown to","status":"deferred","priority":2,"issue_type":"bug","created_at":"2026-06-02T00:33:12.509143215Z","created_by":"durakovic","updated_at":"2026-06-09T07:29:33.185782737Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","oraclemcp-guard"],"dependencies":[{"issue_id":"oracle-qm3q.8","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.509143215Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-qm3q.8","title":"oraclemcp-guard: wire SideEffectOracle::statement_purity (trigger/VPD walk) into classifier SELECT/DML; fix misleading comment","description":"DEFERRED (2026-06-09): the target file crates/oraclemcp-guard/src/classifier.rs now lives in the PUBLISHED, external MuhDur/oraclemcp repo (removed from this workspace in the E-4 depend-back) — not editable here. Also gated: it fires only 'when the engine binds a real SideEffectOracle', which the read-only oraclemcp server does not do. Implement in the oraclemcp repo + a 0.1.x bump if/when a live side-effect oracle is bound. Inapplicable to the current read-only surface.","notes":"PASS 2026-06-02 (partial): Root-cause-fixed the wiring gap and the false comment. statement_purity is now an actual production caller: classify_statement's Statement::Query arm extracts base objects via the new query_base_objects() walker (FROM/JOIN tables + CTE bodies + derived subqueries + set-op arms; CTE aliases excluded) and consults oracle.statement_purity(&base_objects), escalating a UDF-free SELECT to Guarded on an explicit ProvenSideEffecting verdict. Verified the headline regression FAILS before the fix (SELECT * FROM orders -> Safe) and PASSES after (-> Guarded) by temporarily neutralizing the consult. PARTIAL (not done) because the full fail-closed posture the bead ultimately wants — escalate on Unknown to","status":"deferred","priority":2,"issue_type":"bug","created_at":"2026-06-02T00:33:12.509143215Z","created_by":"durakovic","updated_at":"2026-06-23T20:59:27.064031520Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","oraclemcp-guard"],"dependencies":[{"issue_id":"oracle-qm3q.8","depends_on_id":"oracle-plsql-converge-0lnu.11.6","type":"blocks","created_at":"2026-06-23T20:59:27.056748246Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-qm3q.8","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.509143215Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qm3q.9","title":"plsql-engine analyze_project: pair lowered declarations to bodies by span, not filtered index","description":"Source: verify-and-hunt + strict ground-truth calibration workflow (2026-06-02).\n\n### Site crates/plsql-engine/src/lib.rs:915 — CONFIRMED DEFECT, severity=medium\n**Impact:** In a deployment .sql file where a top-level DDL (e.g. CREATE TABLE) precedes two or more stored programs, the call-graph Calls edges and table Reads/Writes edges plus DependencyEdge facts of a later procedure/function are silently derived from an EARLIER object's body, corrupting find_callers/find_callees/what_breaks/plsql_analyze impact results with no diagnostic.\n**Evidence:** lib.rs:903 `for (decl_idx, decl) in lowered.declarations.iter().enumerate()` then lib.rs:914-915 `ast.body_statements.get(decl_idx).filter(|s| !s.is_empty())`. ast.rs:432-435 documents body_statements is parallel with root.declarations (NOT lowered.declarations). tree_lower.rs:121-126 pushes to decls+body_stmts in lockstep; AstDecl::Ddl (line 239) and AstDecl::Unknown (line 246) each occupy a slot with an empty vec![] body. lower.rs:144-182: lower_top_level pushes NO declaration for AstDecl::Ddl/Unknown, only a diagnostic -> lowered.declarations is a filtered subset. analyze_project uses Antlr4RustBackend (lib.rs:788), the path that produces parallel body_statements. decl_idx is used only at lines 903 and 915 (grep confirmed), with no compensating span/index map. Throwaway integration test against the real APIs printed: root.declarations.len()=3, body_statements.len()=3 ([0]=len0 table, \n**Repro/trigger:** Input file: `CREATE TABLE foo (id NUMBER);` then `CREATE OR REPLACE PROCEDURE p1 IS BEGIN INSERT INTO t1 VALUES(1); END; /` then `CREATE OR REPLACE PROCEDURE p2 IS BEGIN INSERT INTO t2 VALUES(2); END; /`. Empirically (verified by running parse_with_backend(Antlr4RustBackend)+lower_top_level): caller P2 (lowered[1]) is positionally paired with body_statements[1] = P1's body, the non-empty filter passes, the correct span-text fallback is skipped, and P2 is attributed a Writes edge to T1 (P1's table) instead of T2. The common DDL-then-single-package case is masked only because the dropped DDL slot lands at empty index 0; the bug bites whenever a mis-indexed slot is non-empty (a real object prec\n**Suggested fix:** Stop indexing parser-parallel ast.body_statements with the filtered decl_idx. Build a span-keyed map by zipping ast.root.declarations with ast.body_statements (each AstDecl exposes .span() via Spanned; each lowered Declaration carries decl.common().span), then in the loop look up body by decl.common().span instead of position. Add a regression test: CREATE TABLE followed by two procedures with distinct INSERT/CALL targets, asserting P2's Writes/Calls edges reference its own body (T2), not T1.\n\n## Acceptance criteria\n- [ ] Root cause fixed in production code (not just the symptom).\n- [ ] A regression test reproduces the defect before the fix (fails) and passes after.\n- [ ] `cargo test -p ` + `cargo clippy -p --all-targets -- -D warnings` green; `cargo fmt` (oraclemcp-* only).\n- [ ] No behavior regression on existing tests / adversarial corpus.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-06-02T00:33:12.619886638Z","created_by":"durakovic","updated_at":"2026-06-02T06:17:12.479755201Z","closed_at":"2026-06-02T06:17:12.479517183Z","close_reason":"[done] implemented via parallel worktree workflow (commit efe4872204), re-verified on main. Root-cause fixed in analyze_project. The loop iterated the FILTERED lowered.declarations but indexed parser-parallel ast.body_statements with the lowered loop index decl_idx; a dropped DDL/Unknown decl ahead of real programs shifted indices, so a later proc's body (hence its Calls/Reads/Writes edges + DependencyEdge facts) was sourced from an earlier object. Fix builds a HashMap> by zipping ast.root.declarations (via Spanned::span) with ast.body_statements, then looks up the body by decl.common().span (which lower_top_level threads through make_common, so it equals the AstDecl span) instead of by position. Text-scanner span-slice fallback preserved for decls whose spa","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["hunt-2026-06-02","plsql-engine"],"dependencies":[{"issue_id":"oracle-qm3q.9","depends_on_id":"oracle-qm3q","type":"parent-child","created_at":"2026-06-02T00:33:12.619886638Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qmg","title":"PLSQL-DEP-015 — Implement `plsql-depgraph explain `: print provenance + evidence (source span, SQL/PLSQL statement, resolution strategy, catalog facts, confidence, dynamic-SQL evidence)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-13T10:44:10.011311667Z","closed_at":"2026-05-13T10:44:10.011001789Z","close_reason":"explain_edge/node/path with full provenance+evidence, CLI subcommand, robot-JSON, 6 tests, 20 total pass","external_ref":"PLSQL-DEP-015","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:dependency-graph","effort:M","layer:2","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-qmg","depends_on_id":"oracle-h2v","type":"blocks","created_at":"2026-05-12T14:52:17.684819090Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-qmwz","title":"OMCP — oraclemcp: open-source Oracle MCP server in Rust (engine-backed, safe-by-default)","description":"ROOT EPIC — the whole oraclemcp initiative. Read this first; it is the single source of project context for every descendant bead.\n\n## What we are building\nA long-lived **MCP server** (Model Context Protocol, JSON-RPC 2.0) that exposes an Oracle database to AI coding agents through a small, well-designed tool surface, with **deep PL/SQL intelligence** (real ANTLR parser -> IR -> dependency graph -> lineage -> SAST -> change-impact) and **fail-closed safety**. Harness-agnostic: speaks stdio + Streamable HTTP, so Claude Code, Codex, Gemini CLI, Hermes, Cursor, VS Code Agent Mode etc. all use it with no bespoke integration.\n\n## Strategic frame (load-bearing decisions)\n- **Improve in place now, extract later.** All work happens inside the existing `plsql-intelligence` Cargo workspace (the `crates/plsql-mcp` crate + the `plsql-*` engine crates). We do NOT split repos or publish to crates.io yet. Reason: the split-and-publish-back is a one-way door (semver treadmill, doubled CI); doing the same modular extraction inside one workspace first is a two-way door that yields 100% of the modularity with none of the coordination tax. Extraction to a separate `oraclemcp` repo + crates.io publish is deferred to the trigger-gated Phase E.\n- **Naming:** the repo/platform stays `plsql-intelligence`; **`oraclemcp` is the name of the MCP-server binary** (the search-term-owning surface). Market as MCP, build as platform.\n- **License:** uniformly Apache-2.0 OR MIT. No commercial/FSL tier (the former plsql-mcp-pro idea is dropped).\n- **One full product binary.** The shipped `oraclemcp` binary ALWAYS includes the full engine; the engine is never an optional build-out. The only feature toggle is `live-db` (the Oracle driver + Instant Client dependency): with it off you get a pure offline static-analysis server with zero native deps. The `oraclemcp-*` core crates and `plsql-*` engine crates are also reusable libraries (e.g. `cargo add plsql-parser-antlr`).\n- **One-way dependency, enforced now:** the MCP/core depends on the engine; the engine never depends on the MCP. Engine tools implement the core's Tool/registry trait. A CI dependency-lint enforces this so Phase E extraction is mechanical.\n\n## The differentiator + the safety spine\n- **Engine-aware fail-closed classifier:** because we ship a real PL/SQL call-graph, the classifier can PROVE purity (never assume it). A statement clears to `Safe` only on an explicit `ProvenReadOnly` verdict; unknown/`Unmeasured`/opaque-dynamic/cycle -> fail-closed. This catches `SELECT side_effecting_fn() FROM dual`, side-effecting triggers/VPD on reads, and `EXECUTE IMMEDIATE` DML that no string/AST classifier can see. No off-the-shelf Oracle MCP can do this.\n- **Operating levels (one user, all levels):** READ_ONLY (default) -> READ_WRITE -> DDL -> ADMIN, each escalation gated by an in-band human confirmation (DCG-style / MCP elicitation; device 2FA is OUT OF SCOPE). Per-target `max_level` ceiling; `protected` profiles get three independent locks.\n- **Honesty laws:** the allow-once token is friction NOT a control; the server is never a sandbox; NUMBER->string (no f64); impact preview is execute-in-savepoint-then-rollback, not EXPLAIN-PLAN cardinality.\n\n## Connectivity\nThick mode (ODPI-C + Oracle Instant Client) — the only path to wallet/Kerberos/mTLS/OCI IAM/Autonomous DB. Min Oracle 19c through 23ai. Not hermetic (needs Instant Client at runtime; Docker-first distribution amortizes the ~100MB).\n\n## How to read the graph\nChildren are the 5 roadmap phases (Phase 0 substrate -> Phase 1 v1 -> Phase 2 hardening -> Phase 3 deferred -> Phase E extraction) plus a Testing & Quality epic. Each phase epic links its tasks; tasks carry `blocks` dependencies matching the plan's critical path. The source plan is docs/plans/2026-06-01-oraclemcp-shared-mcp-core.md, but these beads are intended to be self-contained — you should not need it.\n\n## Success criteria for the whole initiative\nA narrow, demonstrably-correct, fail-closed read-only core a DBA trusts, that any MCP agent can use over stdio, with the deep PL/SQL intelligence as the headline feature — shipped in place, then (Phase E) extracted and published.","notes":"STRATEGY REVISED 2026-06-08 (see oracle-qmwz.5 epic): the original 'one full product binary (oraclemcp ALWAYS includes the full engine)' framing is SUPERSEDED by a deliberate TWO-BINARY product ladder — a lean engine-free oraclemcp (Oracle DB MCP) + a full plsql-mcp superset (DB + PL/SQL intelligence + USR loop). Naming kept as oraclemcp + plsql-mcp. Phase E (qmwz.5.*) is now EXECUTING (owner authorized publish; crates.io token present). Tradeoff (eyes-open): walks the one-way door the original plan deferred (separate repo + semver treadmill + doubled CI); the differentiator now lives in plsql-mcp, the search-term in oraclemcp.","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-06-01T13:23:54.010014714Z","created_by":"durakovic","updated_at":"2026-06-08T17:15:20.598240435Z","closed_at":"2026-06-08T17:15:20.597998377Z","close_reason":"SHIPPED (2026-06-08). oraclemcp v0.1.0 is open-source: published to crates.io (9 crates), v0.1.0 GitHub release w/ 6-platform binaries, Instant-Client Docker image on GHCR, listed in the official MCP registry (io.github.MuhDur/oraclemcp, active). plsql-intelligence depends back on the published crates (two-binary ladder). All Phase A-E work landed; the server is built, hardened (13 hunt rounds + mcp-design + reality-check), engine-free (#![forbid(unsafe_code)]), and live. Future-version work + the deferred phase-gated hardening (qm3q.8/.23/.24, ajm2.5, qbqf.4/.5, da9j.11 — all need the live-executor infra) tracked under their own epics. Social-preview PNG is the only cosmetic manual remainder (GitHub Settings upload; no API).","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"labels":["oraclemcp"]} @@ -650,7 +731,12 @@ {"id":"oracle-u8b","title":"PLSQL-CVT-004 — Author engagement-file structure + operational discipline checklist (private; not committed)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T18:19:24.833876105Z","closed_at":"2026-05-15T18:19:24.833594096Z","close_reason":"Shipped docs/commercial/engagement-file-spec.md — public spec for the PRIVATE engagement-file structure. Section A: 7-folder directory layout. Section B: 7-phase operational discipline checklist. Section C: 5 non-negotiable rules. Section D: audit trail w/ ISO-8601 UTC timestamps. DO-NOT-COMMIT warning + gitignore guidance. README index updated. /oracle: operational; anchors via DATABASE-REFERENCE.md + LOW-LEVEL-CATALOGS.md for surface counts.","external_ref":"PLSQL-CVT-004","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:commercial","component:commercial-validation-track","effort:S","layer:ops","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-u8b","depends_on_id":"oracle-uws","type":"blocks","created_at":"2026-05-12T14:10:35.526022119Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-u9b","title":"PLSQL-PLSCOPE-DIFF-001 — Implement PL/Scope diff: compare our symbol references against PL/Scope references","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-16T03:12:57.593567727Z","closed_at":"2026-05-16T03:12:57.593295329Z","close_reason":"Implemented crates/plsql-symbols/src/plscope_diff.rs (commit 02bcec7): diff_plscope() aligns our resolver's reference-use sites against Oracle PL/Scope ground truth (ALL_IDENTIFIERS/ALL_STATEMENTS). PlScopeReference is a local mirror of plsql-catalog CompilerReference keeping plsql-symbols catalog-independent (same shim convention as CatalogResolutionSource — plsql-symbols deps remain core+ir only, no layer inversion); catalog layer maps CompilerReference rows in. Site-keyed on (owner,object,line,col) case-folded; buckets agreed/mismatched/our_only/plscope_only + R13-typed our_unknown_target/plscope_unknown_target (PL/Scope empty-target declaration rows never silently collapse into match/mismatch and are excluded from the agreement-rate denominator). Deterministic BTreeMap index + sorted output, duplicate rows fall through not dropped. PlScopeDiffSummary.target_agreement_rate Option. 10 unit tests + full plsql-symbols suite 125 pass; cargo clippy --no-deps -D warnings clean. PL/Scope USAGE/target column semantics cross-checked against /oracle DATABASE-REFERENCE.md (PLSCOPE_SETTINGS, ALL_IDENTIFIERS/ALL_STATEMENTS). Unblocks PLSCOPE-DIFF-002 (golden tests vs Oracle XE).","external_ref":"PLSQL-PLSCOPE-DIFF-001","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:semantic-layer","effort:L","layer:2","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-u9b","depends_on_id":"oracle-ew2","type":"blocks","created_at":"2026-05-12T14:11:57.583135237Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-u9b","depends_on_id":"oracle-gdf","type":"blocks","created_at":"2026-05-12T14:11:57.161567014Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-u9m","title":"PLSQL-LAB-003 — `make demo-no-db` target + CI integration","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T14:40:52.764902638Z","closed_at":"2026-05-15T14:40:52.764616711Z","close_reason":"Shipped Makefile demo-no-db + demo-no-db-verify + check targets. demo-no-db runs cargo build --workspace --quiet, exercises parse_change_file via cargo test on corpus/lab/hero_diff/change.diff, prints the fixture inventory, and renders a one-line expected_what_breaks.json summary via jq if available. demo-no-db-verify is the CI-friendly gate: runs cargo test -p plsql-lineage parse_change_file plus sanity-checks the hero_diff fixture presence. CI integration: added 'demo-no-db (hero-diff golden gate)' job in .github/workflows/ci.yml between parse-success and plan-lint, runs on every PR (no Oracle, no docker — cheap). 'check' target also added as the project quality gate (fmt + clippy + tests) for local pre-push hygiene. make help renders all 8 targets; make demo-no-db-verify completes green locally. Closes oracle-u9m. Cite: /oracle skill audit + AGENTS.md §'Landing the plane' (quality gate).","external_ref":"PLSQL-LAB-003","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:corpus","component:lab-corpus","effort:S","layer:cross-cutting","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-u9m","depends_on_id":"oracle-ml1","type":"blocks","created_at":"2026-05-12T14:10:39.970010632Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} -{"id":"oracle-ublu","title":"PLSQL-RELEASE-001 — First public release of the full GA product (1.0.0)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"deferred","priority":1,"issue_type":"epic","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-12T15:02:27.549219762Z","external_ref":"PLSQL-RELEASE-001","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:release-gate","effort:XL","layer:cross-cutting","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-ublu","depends_on_id":"oracle-056","type":"blocks","created_at":"2026-05-12T14:58:18.943854120Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0ean","type":"blocks","created_at":"2026-05-12T14:57:02.419466728Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0mq","type":"blocks","created_at":"2026-05-12T15:01:53.212240031Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0xgb","type":"blocks","created_at":"2026-05-12T14:58:44.900726951Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0z5a","type":"blocks","created_at":"2026-05-12T15:01:47.994325277Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-11x","type":"blocks","created_at":"2026-05-12T15:02:27.548651837Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-14cy","type":"blocks","created_at":"2026-05-12T15:01:45.467333766Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-15g","type":"blocks","created_at":"2026-05-12T14:57:45.870265821Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1b8","type":"blocks","created_at":"2026-05-12T15:01:35.132178109Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1eq","type":"blocks","created_at":"2026-05-12T15:02:09.082776615Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1ia","type":"blocks","created_at":"2026-05-12T14:57:42.240615171Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1mr5","type":"blocks","created_at":"2026-05-12T15:00:05.211028578Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1nbi","type":"blocks","created_at":"2026-05-12T14:59:21.628794509Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1p7","type":"blocks","created_at":"2026-05-12T15:02:03.808076352Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1p93","type":"blocks","created_at":"2026-05-12T14:59:46.466289077Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1w0","type":"blocks","created_at":"2026-05-12T14:57:31.659557712Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1xb","type":"blocks","created_at":"2026-05-12T15:00:16.286562330Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-236z","type":"blocks","created_at":"2026-05-12T14:56:12.532415991Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-23b","type":"blocks","created_at":"2026-05-12T14:58:00.068402520Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-28f","type":"blocks","created_at":"2026-05-12T15:01:36.492456693Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2bk","type":"blocks","created_at":"2026-05-12T14:57:29.395315882Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2ezu","type":"blocks","created_at":"2026-05-12T15:01:17.299495648Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2hd","type":"blocks","created_at":"2026-05-12T15:00:12.588050206Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2kz","type":"blocks","created_at":"2026-05-12T15:00:21.348329498Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2sd","type":"blocks","created_at":"2026-05-12T14:58:37.794801909Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2so","type":"blocks","created_at":"2026-05-12T14:57:54.158648986Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-38j","type":"blocks","created_at":"2026-05-12T14:58:41.337657480Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-39b","type":"blocks","created_at":"2026-05-12T14:56:38.452579903Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3ge","type":"blocks","created_at":"2026-05-12T15:02:22.238385Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3l8","type":"blocks","created_at":"2026-05-12T15:00:15.048841320Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3t2f","type":"blocks","created_at":"2026-05-12T14:58:55.513348401Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3tp","type":"blocks","created_at":"2026-05-12T15:02:16.950411503Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3vc8","type":"blocks","created_at":"2026-05-12T14:56:09.167772985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-40k","type":"blocks","created_at":"2026-05-12T15:00:30.025530520Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-425","type":"blocks","created_at":"2026-05-12T15:01:32.507027382Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-45iq","type":"blocks","created_at":"2026-05-12T14:58:58.101532446Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4ai","type":"blocks","created_at":"2026-05-12T14:58:23.753637466Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4aw","type":"blocks","created_at":"2026-05-12T15:00:47.916884858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4fdc","type":"blocks","created_at":"2026-05-12T15:01:15.942834144Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4k4o","type":"blocks","created_at":"2026-05-12T14:56:46.486788696Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4nj","type":"blocks","created_at":"2026-05-12T14:56:41.827768420Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4nq6","type":"blocks","created_at":"2026-05-12T14:56:27.004278482Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4ru","type":"blocks","created_at":"2026-05-12T15:02:02.492438737Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4tvf","type":"blocks","created_at":"2026-05-12T14:59:01.620064300Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4zk","type":"blocks","created_at":"2026-05-12T15:00:22.577987924Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-57g","type":"blocks","created_at":"2026-05-12T14:58:31.972210988Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5c0q","type":"blocks","created_at":"2026-05-12T15:01:50.547038726Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5fv1","type":"blocks","created_at":"2026-05-12T14:59:14.201533861Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5hx","type":"blocks","created_at":"2026-05-12T14:57:23.678533250Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5jw","type":"blocks","created_at":"2026-05-12T14:57:50.604974472Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5k8k","type":"blocks","created_at":"2026-05-12T14:57:25.912642152Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ktl","type":"blocks","created_at":"2026-05-12T14:59:11.647741617Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ou","type":"blocks","created_at":"2026-05-12T15:00:25.062146198Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5pf5","type":"blocks","created_at":"2026-05-12T14:58:47.260812927Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5q0","type":"blocks","created_at":"2026-05-12T14:57:48.298476873Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5u5","type":"blocks","created_at":"2026-05-12T15:02:20.962917355Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ue","type":"blocks","created_at":"2026-05-12T14:57:35.121187255Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5vga","type":"blocks","created_at":"2026-05-12T14:57:09.360227737Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5xh","type":"blocks","created_at":"2026-05-12T15:00:35.078763267Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-63k","type":"blocks","created_at":"2026-05-12T15:00:51.764367599Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-64ps","type":"blocks","created_at":"2026-05-12T14:56:18.074188048Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6bj","type":"blocks","created_at":"2026-05-12T14:57:15.305045840Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6fw8","type":"blocks","created_at":"2026-05-12T15:01:10.127839794Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6h7","type":"blocks","created_at":"2026-05-12T14:58:28.404798326Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6hlb","type":"blocks","created_at":"2026-05-12T14:59:54.648624339Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6of","type":"blocks","created_at":"2026-05-12T15:02:05.184067392Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6tdv","type":"blocks","created_at":"2026-05-12T14:56:21.417926816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-716r","type":"blocks","created_at":"2026-05-12T14:58:02.420764699Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-72o","type":"blocks","created_at":"2026-05-12T14:57:44.616766947Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-764","type":"blocks","created_at":"2026-05-12T14:56:35.042480638Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7gr3","type":"blocks","created_at":"2026-05-12T14:56:48.653192470Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7lq","type":"blocks","created_at":"2026-05-12T15:02:14.392767332Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7mpc","type":"blocks","created_at":"2026-05-12T14:59:34.093302176Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7nmg","type":"blocks","created_at":"2026-05-12T14:59:53.249219228Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7tv","type":"blocks","created_at":"2026-05-12T14:57:41.078491842Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7vl","type":"blocks","created_at":"2026-05-12T14:56:37.319087828Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7x0","type":"blocks","created_at":"2026-05-12T15:01:40.393781265Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7xj","type":"blocks","created_at":"2026-05-12T14:57:36.297867579Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7ya","type":"blocks","created_at":"2026-05-12T15:00:41.584523498Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8345","type":"blocks","created_at":"2026-05-12T14:56:13.624854682Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-843o","type":"blocks","created_at":"2026-05-12T14:58:52.011391082Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-86l2","type":"blocks","created_at":"2026-05-12T14:57:12.998675636Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8bj","type":"blocks","created_at":"2026-05-12T15:00:36.363510773Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8c2b","type":"blocks","created_at":"2026-05-12T14:59:39.010848398Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8cz9","type":"blocks","created_at":"2026-05-12T15:01:28.584407388Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8hju","type":"blocks","created_at":"2026-05-12T15:00:59.645659465Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8hyl","type":"blocks","created_at":"2026-05-12T14:56:14.740803434Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8kn","type":"blocks","created_at":"2026-05-12T14:58:11.434247806Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-928","type":"blocks","created_at":"2026-05-12T15:00:18.784946087Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-96y","type":"blocks","created_at":"2026-05-12T15:01:33.809794269Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9alv","type":"blocks","created_at":"2026-05-12T14:59:08.052190441Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9pac","type":"blocks","created_at":"2026-05-12T14:56:11.441438019Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9rkm","type":"blocks","created_at":"2026-05-12T14:56:23.667339997Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-a9w8","type":"blocks","created_at":"2026-05-12T14:58:53.185587145Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-akn","type":"blocks","created_at":"2026-05-12T14:57:38.684662280Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-alcx","type":"blocks","created_at":"2026-05-12T14:59:58.770053439Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-am0a","type":"blocks","created_at":"2026-05-12T14:59:22.909723020Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-anm","type":"blocks","created_at":"2026-05-12T14:57:20.055575197Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b167","type":"blocks","created_at":"2026-05-12T14:59:30.481739794Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b67g","type":"blocks","created_at":"2026-05-12T15:01:23.072696656Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b8vl","type":"blocks","created_at":"2026-05-12T15:00:01.397803533Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bfr","type":"blocks","created_at":"2026-05-12T15:00:44.119891772Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bh1z","type":"blocks","created_at":"2026-05-12T14:59:26.577399297Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bm2","type":"blocks","created_at":"2026-05-12T15:00:42.859412595Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bt42","type":"blocks","created_at":"2026-05-12T14:59:27.872060893Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-c89","type":"blocks","created_at":"2026-05-12T15:00:23.842948292Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-c8p","type":"blocks","created_at":"2026-05-12T14:58:21.295337581Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-clj","type":"blocks","created_at":"2026-05-12T15:00:54.403996634Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-clr8","type":"blocks","created_at":"2026-05-12T15:01:46.707017004Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cmi","type":"blocks","created_at":"2026-05-12T15:00:50.413692858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cng","type":"blocks","created_at":"2026-05-12T15:00:57.076394469Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cno","type":"blocks","created_at":"2026-05-12T15:01:58.459521257Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-csnl","type":"blocks","created_at":"2026-05-12T15:01:14.331465147Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d346","type":"blocks","created_at":"2026-05-12T14:59:47.822745379Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d4i2","type":"blocks","created_at":"2026-05-12T14:58:48.461368672Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d812","type":"blocks","created_at":"2026-05-12T14:59:25.353256969Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d9z","type":"blocks","created_at":"2026-05-12T14:58:36.624989467Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dbf4","type":"blocks","created_at":"2026-05-12T14:59:40.220485090Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-df6","type":"blocks","created_at":"2026-05-12T15:02:26.170343804Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dj0","type":"blocks","created_at":"2026-05-12T14:56:32.724765181Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dmm","type":"blocks","created_at":"2026-05-12T15:00:26.332184209Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dpoa","type":"blocks","created_at":"2026-05-12T14:59:51.841844985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dt0","type":"blocks","created_at":"2026-05-12T14:57:33.958050720Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dtt5","type":"blocks","created_at":"2026-05-12T15:00:06.532915139Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-du0","type":"blocks","created_at":"2026-05-12T14:58:17.766046321Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-duou","type":"blocks","created_at":"2026-05-12T14:57:00.048129074Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dvj","type":"blocks","created_at":"2026-05-12T14:57:52.998859393Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e039","type":"blocks","created_at":"2026-05-12T14:59:18.482525783Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e0m","type":"blocks","created_at":"2026-05-12T14:58:26.130164205Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e5i","type":"blocks","created_at":"2026-05-12T14:57:30.522234995Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e8q","type":"blocks","created_at":"2026-05-12T15:00:53.085166597Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ebgz","type":"blocks","created_at":"2026-05-12T14:56:16.951739255Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ed8","type":"blocks","created_at":"2026-05-12T14:57:57.719771598Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-eh0d","type":"blocks","created_at":"2026-05-12T14:56:58.961367322Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-etmk","type":"blocks","created_at":"2026-05-12T15:01:29.910602069Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-euws","type":"blocks","created_at":"2026-05-12T15:01:21.621905229Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ew2","type":"blocks","created_at":"2026-05-12T15:01:54.504523263Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-exzi","type":"blocks","created_at":"2026-05-12T14:58:50.775935531Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ey0","type":"blocks","created_at":"2026-05-12T14:58:20.103321526Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f43w","type":"blocks","created_at":"2026-05-12T15:01:06.328532196Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f6q","type":"blocks","created_at":"2026-05-12T14:57:22.491724830Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f8jn","type":"blocks","created_at":"2026-05-12T15:01:02.354176592Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fdma","type":"blocks","created_at":"2026-05-12T14:58:59.242458288Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fi1","type":"blocks","created_at":"2026-05-12T15:00:49.141890993Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fkpa","type":"blocks","created_at":"2026-05-12T14:59:31.716987489Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fnqf","type":"blocks","created_at":"2026-05-12T14:56:57.836179661Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fnsh","type":"blocks","created_at":"2026-05-12T14:56:56.677147221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-frmg","type":"blocks","created_at":"2026-05-12T15:01:01.019674051Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fyz","type":"blocks","created_at":"2026-05-12T15:00:55.701153629Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-g7d","type":"blocks","created_at":"2026-05-12T14:58:29.525062778Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-g7m6","type":"blocks","created_at":"2026-05-12T14:59:12.976032326Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gbti","type":"blocks","created_at":"2026-05-12T15:00:03.950317115Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gdf","type":"blocks","created_at":"2026-05-12T14:56:39.559563517Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gmjo","type":"blocks","created_at":"2026-05-12T14:56:53.177381200Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gne0","type":"blocks","created_at":"2026-05-12T14:56:24.783799467Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gpq","type":"blocks","created_at":"2026-05-12T15:00:17.528514317Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-h018","type":"blocks","created_at":"2026-05-12T14:58:49.597844454Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-h2v","type":"blocks","created_at":"2026-05-12T14:57:27.049815881Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hcw","type":"blocks","created_at":"2026-05-12T14:58:08.661497314Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-he7","type":"blocks","created_at":"2026-05-12T14:57:11.796143043Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hi0","type":"blocks","created_at":"2026-05-12T14:58:35.472828939Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hk9","type":"blocks","created_at":"2026-05-12T15:02:01.151308919Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ho2i","type":"blocks","created_at":"2026-05-12T14:59:49.178565799Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hotl","type":"blocks","created_at":"2026-05-12T15:01:08.840520117Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ic04","type":"blocks","created_at":"2026-05-12T14:59:24.179080729Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-idy","type":"blocks","created_at":"2026-05-12T14:56:30.473802572Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ijxw","type":"blocks","created_at":"2026-05-12T14:59:02.804932592Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ira","type":"blocks","created_at":"2026-05-12T14:57:37.470011723Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-iwwk","type":"blocks","created_at":"2026-05-12T14:56:54.307404960Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-izq","type":"blocks","created_at":"2026-05-12T14:57:47.119410615Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-j9e","type":"blocks","created_at":"2026-05-12T14:57:28.239720245Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jhrs","type":"blocks","created_at":"2026-05-12T14:59:45.135213528Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jhw","type":"blocks","created_at":"2026-05-12T15:01:59.783243521Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jisl","type":"blocks","created_at":"2026-05-12T14:59:35.297903981Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jlf","type":"blocks","created_at":"2026-05-12T15:00:08.992817930Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jnq","type":"blocks","created_at":"2026-05-12T15:02:15.680680538Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jpik","type":"blocks","created_at":"2026-05-12T14:59:50.497142369Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jzha","type":"blocks","created_at":"2026-05-12T14:59:32.914943165Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kdo","type":"blocks","created_at":"2026-05-12T15:00:10.139272641Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kox3","type":"blocks","created_at":"2026-05-12T14:56:19.163968735Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kpe","type":"blocks","created_at":"2026-05-12T15:01:31.258015309Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kuak","type":"blocks","created_at":"2026-05-12T14:58:54.314059802Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kzp","type":"blocks","created_at":"2026-05-12T14:56:40.705613840Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-l9p","type":"blocks","created_at":"2026-05-12T15:02:11.833695390Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-l9qn","type":"blocks","created_at":"2026-05-12T14:58:43.711546747Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-labs","type":"blocks","created_at":"2026-05-12T14:59:37.818965762Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lcxu","type":"blocks","created_at":"2026-05-12T14:57:10.582029621Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-leq6","type":"blocks","created_at":"2026-05-12T14:58:03.619869129Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ljnt","type":"blocks","created_at":"2026-05-12T15:01:07.618870675Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lkih","type":"blocks","created_at":"2026-05-12T14:59:57.471071373Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lms","type":"blocks","created_at":"2026-05-12T14:58:30.732128265Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lvle","type":"blocks","created_at":"2026-05-12T15:00:58.381352445Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lwj","type":"blocks","created_at":"2026-05-12T15:00:46.680057162Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lwz","type":"blocks","created_at":"2026-05-12T14:56:33.895354137Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m3b","type":"blocks","created_at":"2026-05-12T14:56:31.634277900Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m5d2","type":"blocks","created_at":"2026-05-12T14:59:42.624042719Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m80","type":"blocks","created_at":"2026-05-12T15:02:07.790609362Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m941","type":"blocks","created_at":"2026-05-12T14:56:49.742052602Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mi0","type":"blocks","created_at":"2026-05-12T14:56:36.205750512Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mi9","type":"blocks","created_at":"2026-05-12T15:00:20.041175760Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mjmw","type":"blocks","created_at":"2026-05-12T14:59:41.450147768Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ml1","type":"blocks","created_at":"2026-05-12T14:58:33.122287007Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mln","type":"blocks","created_at":"2026-05-12T15:00:33.839503930Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mp8j","type":"blocks","created_at":"2026-05-12T14:56:08.104406992Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mx9","type":"blocks","created_at":"2026-05-12T14:58:10.074468950Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mxa","type":"blocks","created_at":"2026-05-12T14:58:22.541254817Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-n24m","type":"blocks","created_at":"2026-05-12T14:59:56.038549280Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-n8ce","type":"blocks","created_at":"2026-05-12T14:59:06.722658962Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ncs","type":"blocks","created_at":"2026-05-12T14:57:21.320925386Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ngd4","type":"blocks","created_at":"2026-05-12T14:58:56.837806699Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-nlmk","type":"blocks","created_at":"2026-05-12T14:57:04.788809049Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o3w","type":"blocks","created_at":"2026-05-12T14:58:42.497240606Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o8r","type":"blocks","created_at":"2026-05-12T15:02:18.295669949Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o9f4","type":"blocks","created_at":"2026-05-12T14:59:05.419885083Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ocnd","type":"blocks","created_at":"2026-05-12T14:56:20.269508909Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oe0f","type":"blocks","created_at":"2026-05-12T15:00:00.026854985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ohy","type":"blocks","created_at":"2026-05-12T14:56:44.131369769Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ojh","type":"blocks","created_at":"2026-05-12T14:56:28.159174830Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-on9t","type":"blocks","created_at":"2026-05-12T15:01:27.229167645Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-osg9","type":"blocks","created_at":"2026-05-12T14:59:00.402083756Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ows6","type":"blocks","created_at":"2026-05-12T14:56:52.018086942Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oxc","type":"blocks","created_at":"2026-05-12T15:00:40.282278506Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oxys","type":"blocks","created_at":"2026-05-12T14:59:29.129432950Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ozt","type":"blocks","created_at":"2026-05-12T15:02:23.489425084Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-p5e","type":"blocks","created_at":"2026-05-12T15:00:39.012489731Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-p8p","type":"blocks","created_at":"2026-05-12T15:00:37.665348092Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pbsv","type":"blocks","created_at":"2026-05-12T15:00:02.696794036Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pi3","type":"blocks","created_at":"2026-05-12T14:58:01.276388311Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-prx","type":"blocks","created_at":"2026-05-12T14:58:04.820477160Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pxp","type":"blocks","created_at":"2026-05-12T15:00:27.550772374Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-q2o8","type":"blocks","created_at":"2026-05-12T14:56:50.899637578Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qcma","type":"blocks","created_at":"2026-05-12T15:01:03.645054221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qmg","type":"blocks","created_at":"2026-05-12T14:57:43.437054882Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qol","type":"blocks","created_at":"2026-05-12T15:02:24.830130796Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qz4","type":"blocks","created_at":"2026-05-12T15:01:41.639906563Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r0b","type":"blocks","created_at":"2026-05-12T14:58:06.076028540Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r81h","type":"blocks","created_at":"2026-05-12T14:59:04.075875620Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r9o1","type":"blocks","created_at":"2026-05-12T15:01:04.940799402Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rdz1","type":"blocks","created_at":"2026-05-12T14:57:05.962193405Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rj6","type":"blocks","created_at":"2026-05-12T14:57:49.469778299Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rqt","type":"blocks","created_at":"2026-05-12T15:00:11.370465386Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rusq","type":"blocks","created_at":"2026-05-12T14:59:15.489889816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ruta","type":"blocks","created_at":"2026-05-12T14:56:25.897158907Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ryf","type":"blocks","created_at":"2026-05-12T15:02:19.655441590Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rz6k","type":"blocks","created_at":"2026-05-12T14:59:09.888831149Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-s8ec","type":"blocks","created_at":"2026-05-12T15:00:07.831828791Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sa82","type":"blocks","created_at":"2026-05-12T14:59:36.560680587Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sam6","type":"blocks","created_at":"2026-05-12T15:01:44.249840170Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-skv","type":"blocks","created_at":"2026-05-12T15:00:13.840842028Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sp5","type":"blocks","created_at":"2026-05-12T15:00:31.288226939Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-stw","type":"blocks","created_at":"2026-05-12T15:01:55.871288953Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-tbeh","type":"blocks","created_at":"2026-05-12T14:56:10.243085906Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-tjp1","type":"blocks","created_at":"2026-05-12T14:56:55.475708276Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-txb","type":"blocks","created_at":"2026-05-12T14:57:16.465054043Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u09","type":"blocks","created_at":"2026-05-12T14:57:18.829195880Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u8b","type":"blocks","created_at":"2026-05-12T14:57:17.591890240Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u9b","type":"blocks","created_at":"2026-05-12T15:00:45.400374278Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u9m","type":"blocks","created_at":"2026-05-12T14:58:34.292067953Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ue0","type":"blocks","created_at":"2026-05-12T14:56:42.962958090Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ufp","type":"blocks","created_at":"2026-05-12T14:58:13.937612502Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uggg","type":"blocks","created_at":"2026-05-12T14:58:46.087426547Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uie","type":"blocks","created_at":"2026-05-12T15:01:57.188648816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ukm","type":"blocks","created_at":"2026-05-12T15:01:51.881869540Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-upj","type":"blocks","created_at":"2026-05-12T15:02:10.459384647Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-usq7","type":"blocks","created_at":"2026-05-12T14:57:03.582881333Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-utw","type":"blocks","created_at":"2026-05-12T15:00:32.531949455Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uvs","type":"blocks","created_at":"2026-05-12T14:58:12.649086092Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uws","type":"blocks","created_at":"2026-05-12T14:57:14.191277757Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-v4cj","type":"blocks","created_at":"2026-05-12T14:56:47.571456679Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vblk","type":"blocks","created_at":"2026-05-12T15:01:42.963209357Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vco","type":"blocks","created_at":"2026-05-12T14:57:39.870420814Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vjb","type":"blocks","created_at":"2026-05-12T14:57:32.797417696Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vjpt","type":"blocks","created_at":"2026-05-12T15:01:18.720093004Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vnlk","type":"blocks","created_at":"2026-05-12T14:59:16.824192042Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vqu","type":"blocks","created_at":"2026-05-12T14:57:56.519530560Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vri2","type":"blocks","created_at":"2026-05-12T14:57:08.239061689Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vvxw","type":"blocks","created_at":"2026-05-12T14:57:01.274450678Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vyho","type":"blocks","created_at":"2026-05-12T14:56:22.537221697Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-w7bs","type":"blocks","created_at":"2026-05-12T15:01:49.258167962Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-w9y","type":"blocks","created_at":"2026-05-12T14:58:07.345880523Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wl7","type":"blocks","created_at":"2026-05-12T15:02:06.469862113Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wlnq","type":"blocks","created_at":"2026-05-12T15:01:11.497154436Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wm1","type":"blocks","created_at":"2026-05-12T14:56:29.318138835Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wnqa","type":"blocks","created_at":"2026-05-12T14:56:45.263505301Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wp0i","type":"blocks","created_at":"2026-05-12T14:59:43.847367624Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wua","type":"blocks","created_at":"2026-05-12T15:00:28.815198714Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wwr","type":"blocks","created_at":"2026-05-12T15:02:13.120722289Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x4h","type":"blocks","created_at":"2026-05-12T14:57:55.313677171Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x64d","type":"blocks","created_at":"2026-05-12T14:56:15.840508628Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x8z","type":"blocks","created_at":"2026-05-12T14:57:58.893543762Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xcm","type":"blocks","created_at":"2026-05-12T14:58:40.125783042Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xe8","type":"blocks","created_at":"2026-05-12T14:58:16.544579640Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xi1c","type":"blocks","created_at":"2026-05-12T14:57:07.127616091Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xtp","type":"blocks","created_at":"2026-05-12T14:57:51.827495311Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-y1zw","type":"blocks","created_at":"2026-05-12T15:01:24.501052858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-y29","type":"blocks","created_at":"2026-05-12T14:57:24.803076221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yik","type":"blocks","created_at":"2026-05-12T14:58:38.963176235Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ytv","type":"blocks","created_at":"2026-05-12T15:01:39.131531889Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yx1o","type":"blocks","created_at":"2026-05-12T15:01:12.940400438Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yzf","type":"blocks","created_at":"2026-05-12T14:58:27.245887030Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z1k","type":"blocks","created_at":"2026-05-12T15:01:37.830738478Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z2vc","type":"blocks","created_at":"2026-05-12T15:01:25.894016850Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z7ay","type":"blocks","created_at":"2026-05-12T14:59:20.324490015Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zbt","type":"blocks","created_at":"2026-05-12T14:58:15.257675671Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zj7","type":"blocks","created_at":"2026-05-12T14:58:24.902566019Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zyzk","type":"blocks","created_at":"2026-05-12T15:01:20.168483355Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu","title":"PLSQL-RELEASE-001 — First public release of the full superset (0.5.0)","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"open","priority":1,"issue_type":"epic","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-06-24T03:21:30.013977419Z","external_ref":"PLSQL-RELEASE-001","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:release-gate","effort:XL","layer:cross-cutting","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-ublu","depends_on_id":"oracle-056","type":"blocks","created_at":"2026-05-12T14:58:18.943854120Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0ean","type":"blocks","created_at":"2026-05-12T14:57:02.419466728Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0mq","type":"blocks","created_at":"2026-05-12T15:01:53.212240031Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0xgb","type":"blocks","created_at":"2026-05-12T14:58:44.900726951Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-0z5a","type":"blocks","created_at":"2026-05-12T15:01:47.994325277Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-11x","type":"blocks","created_at":"2026-05-12T15:02:27.548651837Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-14cy","type":"blocks","created_at":"2026-05-12T15:01:45.467333766Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-15g","type":"blocks","created_at":"2026-05-12T14:57:45.870265821Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1b8","type":"blocks","created_at":"2026-05-12T15:01:35.132178109Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1eq","type":"blocks","created_at":"2026-05-12T15:02:09.082776615Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1ia","type":"blocks","created_at":"2026-05-12T14:57:42.240615171Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1mr5","type":"blocks","created_at":"2026-05-12T15:00:05.211028578Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1nbi","type":"blocks","created_at":"2026-05-12T14:59:21.628794509Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1p7","type":"blocks","created_at":"2026-05-12T15:02:03.808076352Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1p93","type":"blocks","created_at":"2026-05-12T14:59:46.466289077Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1w0","type":"blocks","created_at":"2026-05-12T14:57:31.659557712Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-1xb","type":"blocks","created_at":"2026-05-12T15:00:16.286562330Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-236z","type":"blocks","created_at":"2026-05-12T14:56:12.532415991Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-23b","type":"blocks","created_at":"2026-05-12T14:58:00.068402520Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-28f","type":"blocks","created_at":"2026-05-12T15:01:36.492456693Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2bk","type":"blocks","created_at":"2026-05-12T14:57:29.395315882Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2ezu","type":"blocks","created_at":"2026-05-12T15:01:17.299495648Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2hd","type":"blocks","created_at":"2026-05-12T15:00:12.588050206Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2kz","type":"blocks","created_at":"2026-05-12T15:00:21.348329498Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2sd","type":"blocks","created_at":"2026-05-12T14:58:37.794801909Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-2so","type":"blocks","created_at":"2026-05-12T14:57:54.158648986Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-38j","type":"blocks","created_at":"2026-05-12T14:58:41.337657480Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-39b","type":"blocks","created_at":"2026-05-12T14:56:38.452579903Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3ge","type":"blocks","created_at":"2026-05-12T15:02:22.238385Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3l8","type":"blocks","created_at":"2026-05-12T15:00:15.048841320Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3t2f","type":"blocks","created_at":"2026-05-12T14:58:55.513348401Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3tp","type":"blocks","created_at":"2026-05-12T15:02:16.950411503Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-3vc8","type":"blocks","created_at":"2026-05-12T14:56:09.167772985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-40k","type":"blocks","created_at":"2026-05-12T15:00:30.025530520Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-425","type":"blocks","created_at":"2026-05-12T15:01:32.507027382Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-45iq","type":"blocks","created_at":"2026-05-12T14:58:58.101532446Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4ai","type":"blocks","created_at":"2026-05-12T14:58:23.753637466Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4aw","type":"blocks","created_at":"2026-05-12T15:00:47.916884858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4fdc","type":"blocks","created_at":"2026-05-12T15:01:15.942834144Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4k4o","type":"blocks","created_at":"2026-05-12T14:56:46.486788696Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4nj","type":"blocks","created_at":"2026-05-12T14:56:41.827768420Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4nq6","type":"blocks","created_at":"2026-05-12T14:56:27.004278482Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4ru","type":"blocks","created_at":"2026-05-12T15:02:02.492438737Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4tvf","type":"blocks","created_at":"2026-05-12T14:59:01.620064300Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-4zk","type":"blocks","created_at":"2026-05-12T15:00:22.577987924Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-57g","type":"blocks","created_at":"2026-05-12T14:58:31.972210988Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5c0q","type":"blocks","created_at":"2026-05-12T15:01:50.547038726Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5fv1","type":"blocks","created_at":"2026-05-12T14:59:14.201533861Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5hx","type":"blocks","created_at":"2026-05-12T14:57:23.678533250Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5jw","type":"blocks","created_at":"2026-05-12T14:57:50.604974472Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5k8k","type":"blocks","created_at":"2026-05-12T14:57:25.912642152Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ktl","type":"blocks","created_at":"2026-05-12T14:59:11.647741617Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ou","type":"blocks","created_at":"2026-05-12T15:00:25.062146198Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5pf5","type":"blocks","created_at":"2026-05-12T14:58:47.260812927Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5q0","type":"blocks","created_at":"2026-05-12T14:57:48.298476873Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5u5","type":"blocks","created_at":"2026-05-12T15:02:20.962917355Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5ue","type":"blocks","created_at":"2026-05-12T14:57:35.121187255Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5vga","type":"blocks","created_at":"2026-05-12T14:57:09.360227737Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-5xh","type":"blocks","created_at":"2026-05-12T15:00:35.078763267Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-63k","type":"blocks","created_at":"2026-05-12T15:00:51.764367599Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-64ps","type":"blocks","created_at":"2026-05-12T14:56:18.074188048Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6bj","type":"blocks","created_at":"2026-05-12T14:57:15.305045840Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6fw8","type":"blocks","created_at":"2026-05-12T15:01:10.127839794Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6h7","type":"blocks","created_at":"2026-05-12T14:58:28.404798326Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6hlb","type":"blocks","created_at":"2026-05-12T14:59:54.648624339Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6of","type":"blocks","created_at":"2026-05-12T15:02:05.184067392Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-6tdv","type":"blocks","created_at":"2026-05-12T14:56:21.417926816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-716r","type":"blocks","created_at":"2026-05-12T14:58:02.420764699Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-72o","type":"blocks","created_at":"2026-05-12T14:57:44.616766947Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-764","type":"blocks","created_at":"2026-05-12T14:56:35.042480638Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7gr3","type":"blocks","created_at":"2026-05-12T14:56:48.653192470Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7lq","type":"blocks","created_at":"2026-05-12T15:02:14.392767332Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7mpc","type":"blocks","created_at":"2026-05-12T14:59:34.093302176Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7nmg","type":"blocks","created_at":"2026-05-12T14:59:53.249219228Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7tv","type":"blocks","created_at":"2026-05-12T14:57:41.078491842Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7vl","type":"blocks","created_at":"2026-05-12T14:56:37.319087828Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7x0","type":"blocks","created_at":"2026-05-12T15:01:40.393781265Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7xj","type":"blocks","created_at":"2026-05-12T14:57:36.297867579Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-7ya","type":"blocks","created_at":"2026-05-12T15:00:41.584523498Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8345","type":"blocks","created_at":"2026-05-12T14:56:13.624854682Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-843o","type":"blocks","created_at":"2026-05-12T14:58:52.011391082Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-86l2","type":"blocks","created_at":"2026-05-12T14:57:12.998675636Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8bj","type":"blocks","created_at":"2026-05-12T15:00:36.363510773Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8c2b","type":"blocks","created_at":"2026-05-12T14:59:39.010848398Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8cz9","type":"blocks","created_at":"2026-05-12T15:01:28.584407388Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8hju","type":"blocks","created_at":"2026-05-12T15:00:59.645659465Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8hyl","type":"blocks","created_at":"2026-05-12T14:56:14.740803434Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-8kn","type":"blocks","created_at":"2026-05-12T14:58:11.434247806Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-928","type":"blocks","created_at":"2026-05-12T15:00:18.784946087Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-96y","type":"blocks","created_at":"2026-05-12T15:01:33.809794269Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9alv","type":"blocks","created_at":"2026-05-12T14:59:08.052190441Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9pac","type":"blocks","created_at":"2026-05-12T14:56:11.441438019Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-9rkm","type":"blocks","created_at":"2026-05-12T14:56:23.667339997Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-a9w8","type":"blocks","created_at":"2026-05-12T14:58:53.185587145Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-akn","type":"blocks","created_at":"2026-05-12T14:57:38.684662280Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-alcx","type":"blocks","created_at":"2026-05-12T14:59:58.770053439Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-am0a","type":"blocks","created_at":"2026-05-12T14:59:22.909723020Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-anm","type":"blocks","created_at":"2026-05-12T14:57:20.055575197Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b167","type":"blocks","created_at":"2026-05-12T14:59:30.481739794Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b67g","type":"blocks","created_at":"2026-05-12T15:01:23.072696656Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-b8vl","type":"blocks","created_at":"2026-05-12T15:00:01.397803533Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bfr","type":"blocks","created_at":"2026-05-12T15:00:44.119891772Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bh1z","type":"blocks","created_at":"2026-05-12T14:59:26.577399297Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bm2","type":"blocks","created_at":"2026-05-12T15:00:42.859412595Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-bt42","type":"blocks","created_at":"2026-05-12T14:59:27.872060893Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-c89","type":"blocks","created_at":"2026-05-12T15:00:23.842948292Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-c8p","type":"blocks","created_at":"2026-05-12T14:58:21.295337581Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-clj","type":"blocks","created_at":"2026-05-12T15:00:54.403996634Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-clr8","type":"blocks","created_at":"2026-05-12T15:01:46.707017004Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cmi","type":"blocks","created_at":"2026-05-12T15:00:50.413692858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cng","type":"blocks","created_at":"2026-05-12T15:00:57.076394469Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-cno","type":"blocks","created_at":"2026-05-12T15:01:58.459521257Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-csnl","type":"blocks","created_at":"2026-05-12T15:01:14.331465147Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d346","type":"blocks","created_at":"2026-05-12T14:59:47.822745379Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d4i2","type":"blocks","created_at":"2026-05-12T14:58:48.461368672Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d812","type":"blocks","created_at":"2026-05-12T14:59:25.353256969Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-d9z","type":"blocks","created_at":"2026-05-12T14:58:36.624989467Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dbf4","type":"blocks","created_at":"2026-05-12T14:59:40.220485090Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-df6","type":"blocks","created_at":"2026-05-12T15:02:26.170343804Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dj0","type":"blocks","created_at":"2026-05-12T14:56:32.724765181Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dmm","type":"blocks","created_at":"2026-05-12T15:00:26.332184209Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dpoa","type":"blocks","created_at":"2026-05-12T14:59:51.841844985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dt0","type":"blocks","created_at":"2026-05-12T14:57:33.958050720Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dtt5","type":"blocks","created_at":"2026-05-12T15:00:06.532915139Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-du0","type":"blocks","created_at":"2026-05-12T14:58:17.766046321Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-duou","type":"blocks","created_at":"2026-05-12T14:57:00.048129074Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-dvj","type":"blocks","created_at":"2026-05-12T14:57:52.998859393Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e039","type":"blocks","created_at":"2026-05-12T14:59:18.482525783Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e0m","type":"blocks","created_at":"2026-05-12T14:58:26.130164205Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e5i","type":"blocks","created_at":"2026-05-12T14:57:30.522234995Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-e8q","type":"blocks","created_at":"2026-05-12T15:00:53.085166597Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ebgz","type":"blocks","created_at":"2026-05-12T14:56:16.951739255Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ed8","type":"blocks","created_at":"2026-05-12T14:57:57.719771598Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-eh0d","type":"blocks","created_at":"2026-05-12T14:56:58.961367322Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-etmk","type":"blocks","created_at":"2026-05-12T15:01:29.910602069Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-euws","type":"blocks","created_at":"2026-05-12T15:01:21.621905229Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ew2","type":"blocks","created_at":"2026-05-12T15:01:54.504523263Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-exzi","type":"blocks","created_at":"2026-05-12T14:58:50.775935531Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ey0","type":"blocks","created_at":"2026-05-12T14:58:20.103321526Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f43w","type":"blocks","created_at":"2026-05-12T15:01:06.328532196Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f6q","type":"blocks","created_at":"2026-05-12T14:57:22.491724830Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-f8jn","type":"blocks","created_at":"2026-05-12T15:01:02.354176592Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fdma","type":"blocks","created_at":"2026-05-12T14:58:59.242458288Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fi1","type":"blocks","created_at":"2026-05-12T15:00:49.141890993Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fkpa","type":"blocks","created_at":"2026-05-12T14:59:31.716987489Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fnqf","type":"blocks","created_at":"2026-05-12T14:56:57.836179661Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fnsh","type":"blocks","created_at":"2026-05-12T14:56:56.677147221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-frmg","type":"blocks","created_at":"2026-05-12T15:01:01.019674051Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-fyz","type":"blocks","created_at":"2026-05-12T15:00:55.701153629Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-g7d","type":"blocks","created_at":"2026-05-12T14:58:29.525062778Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-g7m6","type":"blocks","created_at":"2026-05-12T14:59:12.976032326Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gbti","type":"blocks","created_at":"2026-05-12T15:00:03.950317115Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gdf","type":"blocks","created_at":"2026-05-12T14:56:39.559563517Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gmjo","type":"blocks","created_at":"2026-05-12T14:56:53.177381200Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gne0","type":"blocks","created_at":"2026-05-12T14:56:24.783799467Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-gpq","type":"blocks","created_at":"2026-05-12T15:00:17.528514317Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-h018","type":"blocks","created_at":"2026-05-12T14:58:49.597844454Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-h2v","type":"blocks","created_at":"2026-05-12T14:57:27.049815881Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hcw","type":"blocks","created_at":"2026-05-12T14:58:08.661497314Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-he7","type":"blocks","created_at":"2026-05-12T14:57:11.796143043Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hi0","type":"blocks","created_at":"2026-05-12T14:58:35.472828939Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hk9","type":"blocks","created_at":"2026-05-12T15:02:01.151308919Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ho2i","type":"blocks","created_at":"2026-05-12T14:59:49.178565799Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-hotl","type":"blocks","created_at":"2026-05-12T15:01:08.840520117Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ic04","type":"blocks","created_at":"2026-05-12T14:59:24.179080729Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-idy","type":"blocks","created_at":"2026-05-12T14:56:30.473802572Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ijxw","type":"blocks","created_at":"2026-05-12T14:59:02.804932592Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ira","type":"blocks","created_at":"2026-05-12T14:57:37.470011723Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-iwwk","type":"blocks","created_at":"2026-05-12T14:56:54.307404960Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-izq","type":"blocks","created_at":"2026-05-12T14:57:47.119410615Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-j9e","type":"blocks","created_at":"2026-05-12T14:57:28.239720245Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jhrs","type":"blocks","created_at":"2026-05-12T14:59:45.135213528Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jhw","type":"blocks","created_at":"2026-05-12T15:01:59.783243521Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jisl","type":"blocks","created_at":"2026-05-12T14:59:35.297903981Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jlf","type":"blocks","created_at":"2026-05-12T15:00:08.992817930Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jnq","type":"blocks","created_at":"2026-05-12T15:02:15.680680538Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jpik","type":"blocks","created_at":"2026-05-12T14:59:50.497142369Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-jzha","type":"blocks","created_at":"2026-05-12T14:59:32.914943165Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kdo","type":"blocks","created_at":"2026-05-12T15:00:10.139272641Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kox3","type":"blocks","created_at":"2026-05-12T14:56:19.163968735Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kpe","type":"blocks","created_at":"2026-05-12T15:01:31.258015309Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kuak","type":"blocks","created_at":"2026-05-12T14:58:54.314059802Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-kzp","type":"blocks","created_at":"2026-05-12T14:56:40.705613840Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-l9p","type":"blocks","created_at":"2026-05-12T15:02:11.833695390Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-l9qn","type":"blocks","created_at":"2026-05-12T14:58:43.711546747Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-labs","type":"blocks","created_at":"2026-05-12T14:59:37.818965762Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lcxu","type":"blocks","created_at":"2026-05-12T14:57:10.582029621Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-leq6","type":"blocks","created_at":"2026-05-12T14:58:03.619869129Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ljnt","type":"blocks","created_at":"2026-05-12T15:01:07.618870675Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lkih","type":"blocks","created_at":"2026-05-12T14:59:57.471071373Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lms","type":"blocks","created_at":"2026-05-12T14:58:30.732128265Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lvle","type":"blocks","created_at":"2026-05-12T15:00:58.381352445Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lwj","type":"blocks","created_at":"2026-05-12T15:00:46.680057162Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-lwz","type":"blocks","created_at":"2026-05-12T14:56:33.895354137Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m3b","type":"blocks","created_at":"2026-05-12T14:56:31.634277900Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m5d2","type":"blocks","created_at":"2026-05-12T14:59:42.624042719Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m80","type":"blocks","created_at":"2026-05-12T15:02:07.790609362Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-m941","type":"blocks","created_at":"2026-05-12T14:56:49.742052602Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mi0","type":"blocks","created_at":"2026-05-12T14:56:36.205750512Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mi9","type":"blocks","created_at":"2026-05-12T15:00:20.041175760Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mjmw","type":"blocks","created_at":"2026-05-12T14:59:41.450147768Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ml1","type":"blocks","created_at":"2026-05-12T14:58:33.122287007Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mln","type":"blocks","created_at":"2026-05-12T15:00:33.839503930Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mp8j","type":"blocks","created_at":"2026-05-12T14:56:08.104406992Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mx9","type":"blocks","created_at":"2026-05-12T14:58:10.074468950Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-mxa","type":"blocks","created_at":"2026-05-12T14:58:22.541254817Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-n24m","type":"blocks","created_at":"2026-05-12T14:59:56.038549280Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-n8ce","type":"blocks","created_at":"2026-05-12T14:59:06.722658962Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ncs","type":"blocks","created_at":"2026-05-12T14:57:21.320925386Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ngd4","type":"blocks","created_at":"2026-05-12T14:58:56.837806699Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-nlmk","type":"blocks","created_at":"2026-05-12T14:57:04.788809049Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o3w","type":"blocks","created_at":"2026-05-12T14:58:42.497240606Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o8r","type":"blocks","created_at":"2026-05-12T15:02:18.295669949Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-o9f4","type":"blocks","created_at":"2026-05-12T14:59:05.419885083Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ocnd","type":"blocks","created_at":"2026-05-12T14:56:20.269508909Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oe0f","type":"blocks","created_at":"2026-05-12T15:00:00.026854985Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ohy","type":"blocks","created_at":"2026-05-12T14:56:44.131369769Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ojh","type":"blocks","created_at":"2026-05-12T14:56:28.159174830Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-on9t","type":"blocks","created_at":"2026-05-12T15:01:27.229167645Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-osg9","type":"blocks","created_at":"2026-05-12T14:59:00.402083756Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ows6","type":"blocks","created_at":"2026-05-12T14:56:52.018086942Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oxc","type":"blocks","created_at":"2026-05-12T15:00:40.282278506Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-oxys","type":"blocks","created_at":"2026-05-12T14:59:29.129432950Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ozt","type":"blocks","created_at":"2026-05-12T15:02:23.489425084Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-p5e","type":"blocks","created_at":"2026-05-12T15:00:39.012489731Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-p8p","type":"blocks","created_at":"2026-05-12T15:00:37.665348092Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pbsv","type":"blocks","created_at":"2026-05-12T15:00:02.696794036Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pi3","type":"blocks","created_at":"2026-05-12T14:58:01.276388311Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"blocks","created_at":"2026-06-23T20:56:28.095820055Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-prx","type":"blocks","created_at":"2026-05-12T14:58:04.820477160Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-pxp","type":"blocks","created_at":"2026-05-12T15:00:27.550772374Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-q2o8","type":"blocks","created_at":"2026-05-12T14:56:50.899637578Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qcma","type":"blocks","created_at":"2026-05-12T15:01:03.645054221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qmg","type":"blocks","created_at":"2026-05-12T14:57:43.437054882Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qol","type":"blocks","created_at":"2026-05-12T15:02:24.830130796Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-qz4","type":"blocks","created_at":"2026-05-12T15:01:41.639906563Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r0b","type":"blocks","created_at":"2026-05-12T14:58:06.076028540Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r81h","type":"blocks","created_at":"2026-05-12T14:59:04.075875620Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-r9o1","type":"blocks","created_at":"2026-05-12T15:01:04.940799402Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rdz1","type":"blocks","created_at":"2026-05-12T14:57:05.962193405Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rj6","type":"blocks","created_at":"2026-05-12T14:57:49.469778299Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rqt","type":"blocks","created_at":"2026-05-12T15:00:11.370465386Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rusq","type":"blocks","created_at":"2026-05-12T14:59:15.489889816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ruta","type":"blocks","created_at":"2026-05-12T14:56:25.897158907Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ryf","type":"blocks","created_at":"2026-05-12T15:02:19.655441590Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-rz6k","type":"blocks","created_at":"2026-05-12T14:59:09.888831149Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-s8ec","type":"blocks","created_at":"2026-05-12T15:00:07.831828791Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sa82","type":"blocks","created_at":"2026-05-12T14:59:36.560680587Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sam6","type":"blocks","created_at":"2026-05-12T15:01:44.249840170Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-skv","type":"blocks","created_at":"2026-05-12T15:00:13.840842028Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-sp5","type":"blocks","created_at":"2026-05-12T15:00:31.288226939Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-stw","type":"blocks","created_at":"2026-05-12T15:01:55.871288953Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-tbeh","type":"blocks","created_at":"2026-05-12T14:56:10.243085906Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-tjp1","type":"blocks","created_at":"2026-05-12T14:56:55.475708276Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-txb","type":"blocks","created_at":"2026-05-12T14:57:16.465054043Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u09","type":"blocks","created_at":"2026-05-12T14:57:18.829195880Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u8b","type":"blocks","created_at":"2026-05-12T14:57:17.591890240Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u9b","type":"blocks","created_at":"2026-05-12T15:00:45.400374278Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-u9m","type":"blocks","created_at":"2026-05-12T14:58:34.292067953Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ue0","type":"blocks","created_at":"2026-05-12T14:56:42.962958090Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ufp","type":"blocks","created_at":"2026-05-12T14:58:13.937612502Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uggg","type":"blocks","created_at":"2026-05-12T14:58:46.087426547Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uie","type":"blocks","created_at":"2026-05-12T15:01:57.188648816Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ukm","type":"blocks","created_at":"2026-05-12T15:01:51.881869540Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-upj","type":"blocks","created_at":"2026-05-12T15:02:10.459384647Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-usq7","type":"blocks","created_at":"2026-05-12T14:57:03.582881333Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-utw","type":"blocks","created_at":"2026-05-12T15:00:32.531949455Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uvs","type":"blocks","created_at":"2026-05-12T14:58:12.649086092Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-uws","type":"blocks","created_at":"2026-05-12T14:57:14.191277757Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-v4cj","type":"blocks","created_at":"2026-05-12T14:56:47.571456679Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vblk","type":"blocks","created_at":"2026-05-12T15:01:42.963209357Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vco","type":"blocks","created_at":"2026-05-12T14:57:39.870420814Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vjb","type":"blocks","created_at":"2026-05-12T14:57:32.797417696Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vjpt","type":"blocks","created_at":"2026-05-12T15:01:18.720093004Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vnlk","type":"blocks","created_at":"2026-05-12T14:59:16.824192042Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vqu","type":"blocks","created_at":"2026-05-12T14:57:56.519530560Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vri2","type":"blocks","created_at":"2026-05-12T14:57:08.239061689Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vvxw","type":"blocks","created_at":"2026-05-12T14:57:01.274450678Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-vyho","type":"blocks","created_at":"2026-05-12T14:56:22.537221697Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-w7bs","type":"blocks","created_at":"2026-05-12T15:01:49.258167962Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-w9y","type":"blocks","created_at":"2026-05-12T14:58:07.345880523Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wl7","type":"blocks","created_at":"2026-05-12T15:02:06.469862113Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wlnq","type":"blocks","created_at":"2026-05-12T15:01:11.497154436Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wm1","type":"blocks","created_at":"2026-05-12T14:56:29.318138835Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wnqa","type":"blocks","created_at":"2026-05-12T14:56:45.263505301Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wp0i","type":"blocks","created_at":"2026-05-12T14:59:43.847367624Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wua","type":"blocks","created_at":"2026-05-12T15:00:28.815198714Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-wwr","type":"blocks","created_at":"2026-05-12T15:02:13.120722289Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x4h","type":"blocks","created_at":"2026-05-12T14:57:55.313677171Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x64d","type":"blocks","created_at":"2026-05-12T14:56:15.840508628Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-x8z","type":"blocks","created_at":"2026-05-12T14:57:58.893543762Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xcm","type":"blocks","created_at":"2026-05-12T14:58:40.125783042Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xe8","type":"blocks","created_at":"2026-05-12T14:58:16.544579640Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xi1c","type":"blocks","created_at":"2026-05-12T14:57:07.127616091Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-xtp","type":"blocks","created_at":"2026-05-12T14:57:51.827495311Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-y1zw","type":"blocks","created_at":"2026-05-12T15:01:24.501052858Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-y29","type":"blocks","created_at":"2026-05-12T14:57:24.803076221Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yik","type":"blocks","created_at":"2026-05-12T14:58:38.963176235Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-ytv","type":"blocks","created_at":"2026-05-12T15:01:39.131531889Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yx1o","type":"blocks","created_at":"2026-05-12T15:01:12.940400438Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-yzf","type":"blocks","created_at":"2026-05-12T14:58:27.245887030Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z1k","type":"blocks","created_at":"2026-05-12T15:01:37.830738478Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z2vc","type":"blocks","created_at":"2026-05-12T15:01:25.894016850Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-z7ay","type":"blocks","created_at":"2026-05-12T14:59:20.324490015Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zbt","type":"blocks","created_at":"2026-05-12T14:58:15.257675671Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zj7","type":"blocks","created_at":"2026-05-12T14:58:24.902566019Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu","depends_on_id":"oracle-zyzk","type":"blocks","created_at":"2026-05-12T15:01:20.168483355Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu.1","title":"Ship.1 release.yml RELEASE_BINS = plsql-depgraph plsql-mcp plsql (+checksums)","description":"release.yml today builds/releases ONLY plsql-depgraph. Add the actual public plsql-mcp binary AND the new `plsql` CLI (F.5) to RELEASE_BINS, with checksums for all three.\nACCEPTANCE: a release builds + checksums plsql-depgraph + plsql-mcp + plsql.\nDEPS: Phase F (the plsql binary).","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:56.684913669Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:59.371457850Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ublu.1","depends_on_id":"oracle-plsql-converge-0lnu.13","type":"blocks","created_at":"2026-06-23T21:01:59.370669112Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.1","depends_on_id":"oracle-ublu","type":"parent-child","created_at":"2026-06-23T21:01:56.684913669Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu.2","title":"Ship.2 ghcr image + MCP-registry dual-tier listing on v* tag","description":"Wire/confirm the publish workflows: make publish-mcp.yml v*-tag-gated (it is workflow_dispatch-only today); push the thin (no Instant Client) Docker image to ghcr; list plsql-mcp in the MCP registry alongside oraclemcp with crisp \"lean (oraclemcp) vs superset (plsql-mcp)\" copy (the funnel). AMEND existing workflows, do not recreate.\nACCEPTANCE: a v* tag publishes the ghcr image + the MCP-registry entry; dual-tier copy live.\nDEPS: Phase C (thin image), Phase A (honesty copy).","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:57.339010209Z","created_by":"durakovic","updated_at":"2026-06-23T21:01:59.898370246Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ublu.2","depends_on_id":"oracle-plsql-converge-0lnu.10","type":"blocks","created_at":"2026-06-23T21:01:59.650805223Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.2","depends_on_id":"oracle-plsql-converge-0lnu.8","type":"blocks","created_at":"2026-06-23T21:01:59.897789738Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.2","depends_on_id":"oracle-ublu","type":"parent-child","created_at":"2026-06-23T21:01:57.339010209Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu.3","title":"Ship.3 Seed coverage_index monotone floor + CHANGELOG row","description":"Seed the coverage_index monotone floor deterministically for the 0.5.0 release and add the coverage_index-over-time row to CHANGELOG.md; the accretion tripwire (X.3) enforces non-regression thereafter.\nACCEPTANCE: 0.5.0 floor seeded; CHANGELOG row present; tripwire green.\nDEPS: Phase G, Phase X.","status":"open","priority":2,"issue_type":"task","created_at":"2026-06-23T21:01:57.993013318Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:11.537867665Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ublu.3","depends_on_id":"oracle-plsql-converge-0lnu.14","type":"blocks","created_at":"2026-06-23T21:02:00.136577617Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.3","depends_on_id":"oracle-plsql-converge-0lnu.15","type":"blocks","created_at":"2026-06-23T21:02:00.537938050Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.3","depends_on_id":"oracle-ublu","type":"parent-child","created_at":"2026-06-23T21:01:57.993013318Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu.4","title":"Ship.4 Tag v0.5.0 + publish (+ optional crates.io publish, oracle-ot1i)","description":"The deterministic release act: with all gates green (E/F/G/X + the release checklist A.6), tag v0.5.0 and publish the thin ghcr image + the MCP-registry entry. Re-confirm the spine pin (=0.4.0; the public-api snapshot lock makes a 0.4.x patch non-breaking). (The OPTIONAL crates.io publish is a SEPARATE bead, Ship.5 / oracle-ot1i — not bundled here.)\nACCEPTANCE: v0.5.0 tagged + ghcr/MCP-registry published; install paths verified; release notes written.\nDEPS: Ship.1, Ship.2, Ship.3, A.6 checklist.","status":"open","priority":1,"issue_type":"task","created_at":"2026-06-23T21:01:58.646829965Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:11.624872201Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ublu.4","depends_on_id":"oracle-plsql-converge-0lnu.8.6","type":"blocks","created_at":"2026-06-23T21:02:01.695872701Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.4","depends_on_id":"oracle-ublu","type":"parent-child","created_at":"2026-06-23T21:01:58.646829965Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.4","depends_on_id":"oracle-ublu.1","type":"blocks","created_at":"2026-06-23T21:02:00.778108644Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.4","depends_on_id":"oracle-ublu.2","type":"blocks","created_at":"2026-06-23T21:02:01.073840576Z","created_by":"durakovic","metadata":"{}","thread_id":""},{"issue_id":"oracle-ublu.4","depends_on_id":"oracle-ublu.3","type":"blocks","created_at":"2026-06-23T21:02:01.485138576Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} +{"id":"oracle-ublu.5","title":"Ship.5 (optional) Publish the plsql-* crates to crates.io","description":"OPTIONAL, post-tag: publish the plsql-* crates to crates.io so users can `cargo install plsql-mcp` (this is the deferred oracle-ot1i). Independent of the binary/Docker/registry release; can ship after v0.5.0.\nACCEPTANCE: plsql-* crates published; `cargo install plsql-mcp` works; OR explicitly kept deferred.\nDEPS: Ship.4 (tag).","status":"open","priority":4,"issue_type":"task","created_at":"2026-06-23T21:13:55.946510287Z","created_by":"durakovic","updated_at":"2026-06-24T03:21:11.713764174Z","source_repo":"plsql-intelligence","compaction_level":0,"original_size":0,"dependencies":[{"issue_id":"oracle-ublu.5","depends_on_id":"oracle-ublu","type":"parent-child","created_at":"2026-06-23T21:13:55.946510287Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ue0","title":"PLSQL-CAT-016 — Catalog capability report (permissions, missing DBA views, PL/Scope availability, DBMS_METADATA availability) + minimum-grant suggestions","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T11:02:28.779182572Z","closed_at":"2026-05-15T11:02:28.778908275Z","close_reason":"Extended CatalogDoctorReport with plscope_availability_per_schema: Vec (schema_name resolved through SymbolInterner, availability mapped from SchemaCatalog.plscope.availability). Sorted by schema_name for stable output. Combined with capabilities.plscope_enabled flag and the MissingPermissionReport rows from CAT-007 (which surface DBMS_METADATA + DBA views + ALL_SOURCE + PLSCOPE_SETTINGS gaps with minimum-grant SQL), this bead's acceptance — 'permissions, missing DBA views, PL/Scope availability, DBMS_METADATA availability + minimum-grant suggestions' — is satisfied by the existing doctor_report() surface. 23/23 catalog tests pass; clippy --all-targets -- -D warnings clean.","external_ref":"PLSQL-CAT-016","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:catalog-snapshot","effort:S","layer:1-5","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-ue0","depends_on_id":"oracle-764","type":"blocks","created_at":"2026-05-12T14:11:22.808700011Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-ufp","title":"PLSQL-FACT-002 — Emit declaration/reference/call facts from semantic model","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-15T20:49:33.139257575Z","closed_at":"2026-05-15T20:49:33.138985227Z","close_reason":"Shipped plsql-ir::fact_emit. emit_declaration_facts/emit_reference_facts/emit_call_facts/emit_declarations_from bridge calls+dml+decls into the FACT-001 stream. table_stub::DeclLike trait shim avoids inverting the symbols→ir layer arrow. All emitters return post-dedup count (FactStore dedups by stable fact: id). 6 unit tests; plsql-ir 110→116. /oracle: DATABASE-REFERENCE.md grammar + LOW-LEVEL-CATALOGS.md ALL_OBJECTS/ALL_DEPENDENCIES/ALL_IDENTIFIERS.","external_ref":"PLSQL-FACT-002","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["component:semantic-layer","effort:M","layer:2","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-ufp","depends_on_id":"oracle-uvs","type":"blocks","created_at":"2026-05-12T14:11:50.804999518Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} {"id":"oracle-uggg","title":"PLSQL-LIN-002 — Implement `impact(node)` traversal with confidence aggregation","description":"Imported from `plan.md` v0.11 on 2026-05-12.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-05-12T14:04:54.684845451Z","updated_at":"2026-05-13T13:02:53.540296120Z","closed_at":"2026-05-13T13:02:53.540015221Z","close_reason":"impact(node) downstream BFS with path-confidence aggregation (max-of-min), affected_nodes summary, unknown-edge accounting; 9 new tests; clippy clean","external_ref":"PLSQL-LIN-002","source_repo":"oracle","compaction_level":0,"original_size":0,"labels":["area:change-impact","component:lineage-engine","effort:M","layer:4","project:plsql-intelligence"],"dependencies":[{"issue_id":"oracle-uggg","depends_on_id":"oracle-0xgb","type":"blocks","created_at":"2026-05-12T14:20:58.737008115Z","created_by":"durakovic","metadata":"{}","thread_id":""}]} diff --git a/.github/workflows/bindgen-roundtrip.yml b/.github/workflows/bindgen-roundtrip.yml index caa5443..9cf8556 100644 --- a/.github/workflows/bindgen-roundtrip.yml +++ b/.github/workflows/bindgen-roundtrip.yml @@ -54,7 +54,7 @@ jobs: --health-start-period 5m steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - name: Install Oracle Instant Client diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 69f4308..95932e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 with: components: rustfmt - run: cargo fmt --all -- --check @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 with: components: clippy - uses: Swatinem/rust-cache@v2 @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: cargo test --workspace --all-targets - run: cargo test --workspace --doc @@ -55,7 +55,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - name: cargo deny (advisories, licenses, bans, sources) run: | @@ -71,7 +71,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: cargo bench --workspace --no-run @@ -80,7 +80,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: cargo run -p corpus-license-check @@ -92,7 +92,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: cargo test -p plsql-parser -p plsql-parser-antlr @@ -105,7 +105,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: make lab-gate @@ -118,7 +118,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - run: make demo-no-db-verify @@ -130,7 +130,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - name: Run plan-lint (human report) run: cargo run -p plan-lint -- --doctor diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d15b621..c3e1c7d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,7 +49,7 @@ jobs: cross: false steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 with: targets: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 diff --git a/.github/workflows/usr.yml b/.github/workflows/usr.yml index 445aa1b..130fa16 100644 --- a/.github/workflows/usr.yml +++ b/.github/workflows/usr.yml @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 # These tests each run the REAL conformance gate, which itself spawns # cargo builds — so a high `--test-threads` launches that many concurrent @@ -70,7 +70,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # tags needed for the release-baseline compare - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - name: §4 monotonic tripwire (public benchmark, never a private estate) run: bash scripts/accretion_tripwire.sh @@ -90,9 +90,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: dtolnay/rust-toolchain@stable - - name: Install nightly (G1 antlr-codegen build) - uses: dtolnay/rust-toolchain@nightly + - uses: dtolnay/rust-toolchain@nightly-2026-05-11 - uses: Swatinem/rust-cache@v2 - name: Full §5 DoD proof (honest SKIP if estate absent) run: bash scripts/usr_acceptance.sh diff --git a/Cargo.toml b/Cargo.toml index 6db3280..e52849b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,6 @@ edition = "2024" license = "Apache-2.0 OR MIT" repository = "https://github.com/MuhDur/plsql-intelligence" homepage = "https://github.com/MuhDur/plsql-intelligence" -rust-version = "1.85" [workspace.dependencies] fs2 = "0.4" diff --git a/Dockerfile b/Dockerfile index 2646485..e69788f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ FROM oraclelinux:9 AS builder RUN dnf -y install gcc java-17-openjdk-headless && dnf clean all && \ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ - | sh -s -- -y --profile minimal --default-toolchain stable + | sh -s -- -y --profile minimal --default-toolchain nightly-2026-05-11 ENV PATH="/root/.cargo/bin:${PATH}" WORKDIR /src COPY . . diff --git a/crates/plsql-accretion/Cargo.toml b/crates/plsql-accretion/Cargo.toml index 076b8cd..53a26f2 100644 --- a/crates/plsql-accretion/Cargo.toml +++ b/crates/plsql-accretion/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "USR loop library (Layer 5): GapRecord capture from honest-uncertainty exhaust (PLSQL-USR-001)" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] fs2 = { workspace = true } diff --git a/crates/plsql-bindgen/Cargo.toml b/crates/plsql-bindgen/Cargo.toml index a0fec68..51bc677 100644 --- a/crates/plsql-bindgen/Cargo.toml +++ b/crates/plsql-bindgen/Cargo.toml @@ -3,7 +3,6 @@ name = "plsql-bindgen" version = "0.1.0" edition.workspace = true license.workspace = true -rust-version.workspace = true description = "Type-safe Rust bindings generation for PL/SQL packages and tables." [[bin]] diff --git a/crates/plsql-catalog/Cargo.toml b/crates/plsql-catalog/Cargo.toml index 41ed60c..1f83042 100644 --- a/crates/plsql-catalog/Cargo.toml +++ b/crates/plsql-catalog/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Offline-first Oracle catalog snapshot model for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [features] default = [] diff --git a/crates/plsql-cicd/Cargo.toml b/crates/plsql-cicd/Cargo.toml index 39accd5..c8a5a95 100644 --- a/crates/plsql-cicd/Cargo.toml +++ b/crates/plsql-cicd/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "CI/CD recompilation cascade types and operations for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [features] default = [] diff --git a/crates/plsql-core/Cargo.toml b/crates/plsql-core/Cargo.toml index 65720cc..9f1e119 100644 --- a/crates/plsql-core/Cargo.toml +++ b/crates/plsql-core/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Shared core types for the plsql-intelligence workspace" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] miette.workspace = true diff --git a/crates/plsql-depgraph/Cargo.toml b/crates/plsql-depgraph/Cargo.toml index 19d5813..b78b81d 100644 --- a/crates/plsql-depgraph/Cargo.toml +++ b/crates/plsql-depgraph/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Typed dependency-graph IR for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] clap = { version = "4.5", features = ["derive"] } diff --git a/crates/plsql-doc/Cargo.toml b/crates/plsql-doc/Cargo.toml index 10f4644..dc7bdd5 100644 --- a/crates/plsql-doc/Cargo.toml +++ b/crates/plsql-doc/Cargo.toml @@ -3,7 +3,6 @@ name = "plsql-doc" version = "0.1.0" edition.workspace = true license.workspace = true -rust-version.workspace = true description = "Documentation generation for PL/SQL packages, procedures, and objects." [dependencies] diff --git a/crates/plsql-engine/Cargo.toml b/crates/plsql-engine/Cargo.toml index 4b2b0b1..bf3a4f8 100644 --- a/crates/plsql-engine/Cargo.toml +++ b/crates/plsql-engine/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Canonical analysis orchestration for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] plsql-catalog = { path = "../plsql-catalog" } diff --git a/crates/plsql-ir/Cargo.toml b/crates/plsql-ir/Cargo.toml index e333420..bf250c4 100644 --- a/crates/plsql-ir/Cargo.toml +++ b/crates/plsql-ir/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-ir" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Typed semantic intermediate representation for plsql-intelligence" diff --git a/crates/plsql-lineage/Cargo.toml b/crates/plsql-lineage/Cargo.toml index 3504ed3..c78fbc1 100644 --- a/crates/plsql-lineage/Cargo.toml +++ b/crates/plsql-lineage/Cargo.toml @@ -3,7 +3,6 @@ name = "plsql-lineage" version = "0.1.0" edition.workspace = true license.workspace = true -rust-version.workspace = true description = "Lineage engine — cross-object impact + classify-change queries." [dependencies] diff --git a/crates/plsql-mcp/Cargo.toml b/crates/plsql-mcp/Cargo.toml index 4adfb52..751ee87 100644 --- a/crates/plsql-mcp/Cargo.toml +++ b/crates/plsql-mcp/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Foundation MCP adapter for the PL/SQL Intelligence engine (Apache-2.0 OR MIT)" edition.workspace = true license.workspace = true -rust-version.workspace = true [features] default = ["live-db"] diff --git a/crates/plsql-output/Cargo.toml b/crates/plsql-output/Cargo.toml index 539fd89..03acbe8 100644 --- a/crates/plsql-output/Cargo.toml +++ b/crates/plsql-output/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Shared output envelopes and schema registry for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] plsql-core = { path = "../plsql-core" } diff --git a/crates/plsql-parser-antlr/Cargo.toml b/crates/plsql-parser-antlr/Cargo.toml index 686a0c5..9975bb1 100644 --- a/crates/plsql-parser-antlr/Cargo.toml +++ b/crates/plsql-parser-antlr/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "ANTLR4-based PL/SQL parser backend (grammar + codegen)" edition.workspace = true license.workspace = true -rust-version.workspace = true # The .g4 grammar files are included as data for the build.rs codegen step. # They are NOT compiled directly — ANTLR generates Rust source from them. diff --git a/crates/plsql-parser-java/Cargo.toml b/crates/plsql-parser-java/Cargo.toml index b644325..5efc7a5 100644 --- a/crates/plsql-parser-java/Cargo.toml +++ b/crates/plsql-parser-java/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-parser-java" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true # Inert historical spike — the parser-backend tournament loser. It builds # and its tests pass, but by design it produces no real parse (worker diff --git a/crates/plsql-parser/Cargo.toml b/crates/plsql-parser/Cargo.toml index 6719b77..2eb8a5a 100644 --- a/crates/plsql-parser/Cargo.toml +++ b/crates/plsql-parser/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "PL/SQL parser frontend: ParseBackend trait, token tape, CST, AST types" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] plsql-core = { path = "../plsql-core" } diff --git a/crates/plsql-privileges/Cargo.toml b/crates/plsql-privileges/Cargo.toml index 13d7528..c424abc 100644 --- a/crates/plsql-privileges/Cargo.toml +++ b/crates/plsql-privileges/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-privileges" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Privilege and authorization model for PL/SQL analysis" diff --git a/crates/plsql-project/Cargo.toml b/crates/plsql-project/Cargo.toml index e759f54..ccd6212 100644 --- a/crates/plsql-project/Cargo.toml +++ b/crates/plsql-project/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-project" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Project model + file discovery for plsql-intelligence (PLSQL-WS-007)" diff --git a/crates/plsql-render/Cargo.toml b/crates/plsql-render/Cargo.toml index 0a014ae..1b14efd 100644 --- a/crates/plsql-render/Cargo.toml +++ b/crates/plsql-render/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "Low-level HTML, Markdown, and SVG render helpers for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] tracing.workspace = true diff --git a/crates/plsql-sast/Cargo.toml b/crates/plsql-sast/Cargo.toml index bc08620..78bdbe6 100644 --- a/crates/plsql-sast/Cargo.toml +++ b/crates/plsql-sast/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-sast" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Static-analysis security rule engine for plsql-intelligence (Layer 3, PLSQL-SAST-001)" diff --git a/crates/plsql-store/Cargo.toml b/crates/plsql-store/Cargo.toml index 7fb487f..c5701f6 100644 --- a/crates/plsql-store/Cargo.toml +++ b/crates/plsql-store/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" description = "SQLite-backed content-addressed cache for plsql-intelligence" edition.workspace = true license.workspace = true -rust-version.workspace = true [dependencies] rusqlite = { version = "0.39.0", features = ["bundled"] } diff --git a/crates/plsql-support/Cargo.toml b/crates/plsql-support/Cargo.toml index 60fdb58..7f3f2ef 100644 --- a/crates/plsql-support/Cargo.toml +++ b/crates/plsql-support/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-support" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Support-bundle exporter with strict redaction manifest (PLSQL-SUPPORT-001)" diff --git a/crates/plsql-symbols/Cargo.toml b/crates/plsql-symbols/Cargo.toml index c74423a..f2554a3 100644 --- a/crates/plsql-symbols/Cargo.toml +++ b/crates/plsql-symbols/Cargo.toml @@ -2,7 +2,6 @@ name = "plsql-symbols" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Symbol table and name resolution for plsql-intelligence" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 92a57c5..0853fd6 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,14 @@ +# This workspace is pinned to NIGHTLY Rust. +# +# The convergence depends on asupersync/oracledb, and asupersync uses +# nightly-only language features (try_trait_v2 + try_trait_v2_residual). +# There is no stable MSRV; bump this date deliberately with asupersync/oracledb +# upgrades and CI workflow pins. +# +# Upstream pins (verified 2026-06-25): +# - oraclemcp: nightly-2026-05-11 +# - rust-oracledb: nightly-2026-05-11 [toolchain] -channel = "stable" +channel = "nightly-2026-05-11" components = ["clippy", "rustfmt"] profile = "minimal" diff --git a/tools/corpus-bench/Cargo.toml b/tools/corpus-bench/Cargo.toml index 9693aaa..fb9bba7 100644 --- a/tools/corpus-bench/Cargo.toml +++ b/tools/corpus-bench/Cargo.toml @@ -2,7 +2,6 @@ name = "corpus-bench" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Benchmark harness: cold/warm parse time across the corpus (PLSQL-PARSE-016)" diff --git a/tools/corpus-grow/Cargo.toml b/tools/corpus-grow/Cargo.toml index cdb05e6..c679eda 100644 --- a/tools/corpus-grow/Cargo.toml +++ b/tools/corpus-grow/Cargo.toml @@ -2,7 +2,6 @@ name = "corpus-grow" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "Synthetic PL/SQL generator: emits valid grammar samples from pattern descriptions (PLSQL-PARSE-018)" diff --git a/tools/corpus-license-check/Cargo.toml b/tools/corpus-license-check/Cargo.toml index bfb010d..300fd5a 100644 --- a/tools/corpus-license-check/Cargo.toml +++ b/tools/corpus-license-check/Cargo.toml @@ -2,7 +2,6 @@ name = "corpus-license-check" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "CI gate: every committed corpus/public file has a manifest entry" diff --git a/tools/plan-lint/Cargo.toml b/tools/plan-lint/Cargo.toml index 8766677..782de48 100644 --- a/tools/plan-lint/Cargo.toml +++ b/tools/plan-lint/Cargo.toml @@ -2,7 +2,6 @@ name = "plan-lint" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "CI gate: validates plan.md structural integrity (PLSQL-PLAN-001)" diff --git a/tools/usr-loop/Cargo.toml b/tools/usr-loop/Cargo.toml index 985f60e..dc66d42 100644 --- a/tools/usr-loop/Cargo.toml +++ b/tools/usr-loop/Cargo.toml @@ -2,7 +2,6 @@ name = "usr-loop" version = "0.1.0" edition.workspace = true -rust-version.workspace = true license.workspace = true description = "USR loop orchestrator: capture honest-uncertainty gaps from an Oracle estate (PLSQL-USR-001)"