Repository navigation
Add GraphPaper agent skill and headless writing workflows - #14
Conversation
…integration tests
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 108a2e689b
ℹ️ 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".
| slot, sep, name = item.partition('=') | ||
| if not sep or slot not in {'llm', 'openrouter', 'typesafe'} or not re.fullmatch(r'[A-Za-z_][A-Za-z0-9_]*', name): | ||
| raise ValueError('Use --key-env typesafe=ENVIRONMENT_VARIABLE (or llm/openrouter).') |
There was a problem hiding this comment.
Accept scholarly credential slots in --key-env
When a Science workflow needs authenticated PubMed or Semantic Scholar access, this validation rejects ncbi=... and semantic_scholar=..., even though Vault.NAMES supports both and ScholarlyClient.search reads them for actual requests. Since JSON-supplied api_keys are also rejected, the documented helper provides no safe way to provision these optional credentials, leaving rate-limited users unable to follow the backend's instruction to add an API key.
Useful? React with 👍 / 👎.
| except (urllib.error.URLError, TimeoutError, OSError): | ||
| raise ClientError('Loopback request failed or timed out. No automatic retry: inspect current jobs before resubmitting a write or paid action.') from None |
There was a problem hiding this comment.
Preserve polling-timeout semantics when the status request stalls
When /api/jobs/{id} fails to respond before the remaining polling deadline, wait() caps that request's socket timeout to the deadline, but this handler converts the resulting timeout into a generic ClientError. The CLI consequently exits with code 2 and omits the structured job payload instead of producing the documented JobTimeout result and exit code 4, which can cause automation to misclassify an ambiguous still-running job; translate this deadline-bound request timeout into JobTimeout while retaining the job ID.
Useful? React with 👍 / 👎.
Verified before mergeFinal skill revision: All 22 agent-skill tests pass on both Windows and Linux, with the actual backend required (no missing-dependency skips). The suite exercises a real headless server process, standard session-cookie HTTP access, graph → angles → outline → draft/export for nonfiction/polemic/fiction using synthetic models, Science plan/author-confirmation boundaries, Inbox import without duplicate upload, reusable voices across projects, stale-save protection, failed-job recovery, settings/credential preservation and workspace locks. The first Windows run caught a mandatory byte-lock read before acquiring the lock; the helper now locks the region without reading it first. It also caught a test fixture's platform newline assumption; multipart tests now verify exact LF and CRLF bytes. No tests were removed or bypassed. Skill matrix: https://github.com/AronAxe/GraphPaper/actions/runs/39114363824 This validates executable backend access, storage and workflow behavior, not live JEV editorial quality or behavior in every agent host. The pack includes separate live-agent acceptance scenarios. No private account/model calls, desktop project changes or user-computer access occurred. Only |
What this adds
A copyable
skills/graphpaper/pack withSKILL.md, six on-demand reference guides, MIT license andscripts/gp.py.The helper starts the existing GraphPaper backend without the desktop window and provides JSON API calls, file upload, job submission/polling/cancellation and direct exports. It does not copy prompts into a second writing pipeline. Agents can use GraphPaper's own model pipeline, or supply their own prose and use its graph/source/voice/decision/review/export functions.
The guides cover nonfiction, polemic, fiction, Science, reusable voices, System One and reversible editing. Angle and outline selection can be delegated to the calling agent; the user does not have to click through GraphPaper. Inbox import is explicit and verified instead of asking for a second upload.
Boundaries
Verification
The missing-skill/helper contract failed before implementation. The 16 standalone client/skill checks now pass in the disposable container; the actual-backend class and headless integration are locally skipped because the source environment is not mounted there. The new Agent skills read-only workflow requires those dependencies and runs the real-HTTP backend and headless-process tests on Windows and Linux; missing dependencies are failures in CI, not passing skips.
Backend tests use the repository's clearly synthetic model fixtures, not live provider calls. Independent live agent behavior/quality scenarios are documented separately and are not claimed completed by these tests. Hosted results pending at PR creation.
Only the new skills folder and its test workflow are changed. No snapshot/transfer workflow is part of this PR.