Skip to content

feat: run every closed feature the service lists - #162

Open
Svilen-Stefanov wants to merge 6 commits into
mainfrom
feat/closed-features
Open

Svilen-Stefanov wants to merge 6 commits into
mainfrom
feat/closed-features

Conversation

@Svilen-Stefanov

@Svilen-Stefanov Svilen-Stefanov commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

The review guide step becomes a generic runner for CodeBoarding's closed features. It reads GET /v1/features, collects the bundle once, posts one request per feature in parallel with the inputs that feature names, and writes each answer to closed/<feature>.json.

  • Never quiet. A feature that never answered is written as skipped or failed, so a reader can tell "not checked" from "nothing found". One feature failing costs no other.
  • Computes nothing. It names no feature, except a fallback to the guide alone for a service with no manifest, which is what production answers until the service ships. Guide output stays byte-identical in review_guide.json.
  • New input closed_features_source, default true. A feature can ask for the repository's source. Only its request carries it, within the service's size limit. Past that, or with false, the request goes without it and says why.
  • Own keys for every feature. A run's llm, key and agent_model, then model, reach every feature on each provider the service can call. A run on a provider it cannot reach, including any custom base URL, keeps its key on the runner, makes no model call and never falls back to the hosted model.
  • New refusals hosted_with_model and license_with_model. On CodeBoarding's key CodeBoarding picks the model, so a workflow that sets model, agent_model or parsing_model with llm: hosted or license now fails with a clear message. This can break a hand-edited workflow, and it is the only change here that can stop a run. The Action can only ask: gha_proxy does not enforce it yet.
  • Fixes a limit. A Function URL counts base64, so a bundle over about 4.5 MB got a 413 while the old check allowed 5.8 MB. Measured against dev: 4.5 MB accepted, 5.0 MB refused.

scripts/review_guide.py is now scripts/closed_features.py. Input review_guide_url keeps its name, because workflows set it. The README's "never reaches CodeBoarding" line is corrected. Apart from those refusals, the step never fails the run. Nothing visible changes.

🤖 Generated with Claude Code

Svilen-Stefanov and others added 2 commits November 1, 2026 01:04
The review guide step becomes a generic runner: it reads GET /v1/features,
collects the bundle once, posts one request per feature in parallel with only
the inputs that feature names, and writes each answer to the artifact. A feature
that never answered is written as skipped or failed, so a reader can tell not
checked from nothing found. It computes nothing and names no feature, except the
fallback to the guide alone for a service with no manifest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only that feature's request carries it, within the size the service names. Past
that, or with closed_features_source: false, the request goes without it and says
why, so the feature reports what it could not check. Also lowers the bundle limit
to what a Function URL really takes: base64 counts, so 5 MB was refused with a 413.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codeboarding-review

codeboarding-review Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

CodeBoarding review

Status: 1 changed component

See the full change in CodeBoarding.

graph LR
    n_action_support_scripts["action_support_scripts"]
    classDef added fill:#1f883d,stroke:#0b5d23,color:#ffffff;
    classDef modified fill:#bf8700,stroke:#7d4e00,color:#ffffff;
    classDef deleted fill:#cf222e,stroke:#82071e,color:#ffffff,stroke-dasharray:5 3;
    class n_action_support_scripts modified;
Loading

download artifacts · run 41308688042

Svilen-Stefanov and others added 4 commits November 1, 2026 01:37
The run's llm, key and model now reach every feature, for each provider the service
can call. A run on a provider it cannot reach makes no model call and is never sent to
the hosted model. The manifest is read with the run's credentials.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
llm: hosted and license now refuse model, agent_model and parsing_model, with
hosted_with_model and license_with_model. A run's own key uses agent_model, then
model, as its analysis does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ivanmilevtues
ivanmilevtues self-requested a review November 2, 2026 15:26

@ivanmilevtues ivanmilevtues left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't really like this (i) icon, doesn't give me a risk vibe:
image.png

@ivanmilevtues
ivanmilevtues marked this pull request as ready for review November 2, 2026 17:28
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-02T17:31:54.558657Z 071e7e9 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 071e7e9dfb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +272 to +275
size = path.stat().st_size
if size > (spec.get("maxFileBytes") or size) or not path.is_file():
continue
files[name] = path.read_text(encoding="utf-8")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reject source symlinks that escape the checkout

When a source-requesting feature runs, a tracked symlink with an allowed extension is followed by stat(), is_file() and read_text(). Consequently, an existing example.py symlink pointing outside the checkout sends the target's contents to the service, even though that target is not tracked repository source. I reproduced this with a tracked .py symlink to a file outside the repository. This can expose runner-local files, particularly on self-hosted runners, and also corrupt the source supplied for analysis. Reject symlinks or verify that each resolved file remains inside the checkout before reading it.

Useful? React with 👍 / 👎.

Comment on lines +474 to +475
done = pool.map(lambda f: run_feature(f, base, ctx, inputs, headers, sources.get(f["name"])), enabled)
results.update({f["name"]: r for f, r in zip(enabled, done)})

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Isolate unexpected exceptions within each feature worker

If one feature returns valid JSON with an unexpected shape, such as null, _answered() raises an uncaught AttributeError. That exception propagates through this pool.map() iterator to the outer handler, bypassing the entire artifact-writing loop, so even other features that completed successfully lose their results and no failure envelope is written. I reproduced the escaping exception with a null response. Catch unexpected exceptions per feature and convert them into failed envelopes so one malformed answer cannot discard every feature's output.

Useful? React with 👍 / 👎.

@ivanmilevtues ivanmilevtues left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have to rename to codeboarding_services or something liek that not have it as clsoed_Funtioncs.

I think parat from that it is quite hard to review and i had to prompt quite a bit here. Looks fine but I think we'd need to revisit this shortly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants