Repeat safety rejections for aggressive code QA work during development

Open
#34,987 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
38/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Quiet
Tech stack
python, rust
Domain
cli, security

Research direction

Start with the uploaded thread 019f58ce-7b0f-7f53-9a05-d3586a8e0d4f and reproduce the repeated safety rejection in Codex CLI v0.144.6 on Darwin. Trace the CLI TUI path for the displayed cybersecurity block and compare it with the reported expected ability to continue or use a documented workaround; the issue is done when the behavior is reproducible and the handling or workaround is verified.

Written by the indexing model from the issue text.

Description

bug CLI safety-check
What version of Codex CLI is running?

v0.144.6

What subscription do you have?

ChatGPT Pro 20x, though strangely, codex CLI says "pro"

Which model were you using?

gpt-5.6-sol

What platform is your computer?

Darwin 25.4.0 arm64 arm

What terminal emulator and version are you using (if applicable)?

Ghostty 1.3.1

Codex doctor report

What issue are you seeing?

Repeat safety checks triggering on very aggressive code quality and correctness workflows for a personal project (not auditing anybody else's software - codex built this entire repo over the past two weeks, basically only stopping right now for the first time):

• The red proof failed exactly as intended: the only failure among 412 controller tests is that the dynamic owner emitted the original ensemble command but not the required workbench command. I’m now wiring that command
  and giving the seven already-existing workbench fault tests a common dynamic_analysis_ selector prefix; no production behavior or assertion is being rewritten.

• Edited 2 files (+25 -7)
  └ crates/hormuz-app/src/workbench/ui.rs (+7 -7)
    7959      #[test]
    7960 -    fn cancellation_wins_the_terminal_commit_and_discards_completed_worker_output()
    7960 +    fn dynamic_analysis_execution_cancellation_wins_and_discards_completed_worker_output()
    7961      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    7998      #[test]
    7999 -    fn cancellation_during_execution_preserves_progress_and_mints_no_result_or_artifact()
    7999 +    fn dynamic_analysis_execution_cancellation_preserves_progress_and_mints_nothing()
    8000      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8087      #[test]
    8088 -    fn cancellation_after_finalization_removes_staging_and_never_publishes()
    8088 +    fn dynamic_analysis_publication_cancellation_removes_finalized_staging()
    8089      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8174      #[test]
    8175 -    fn successful_publication_wins_a_cancellation_race_after_atomic_visibility()
    8175 +    fn dynamic_analysis_atomic_visibility_wins_the_publication_cancellation_race()
    8176      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8261      #[test]
    8262 -    fn publication_worker_panic_after_finalization_discards_staging_and_mints_no_success()
    8262 +    fn dynamic_analysis_publication_worker_panic_discards_finalized_staging()
    8263      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8335      #[test]
    8336 -    fn worker_failure_and_panic_are_typed_and_cannot_mint_a_result()
    8336 +    fn dynamic_analysis_execution_failure_and_panic_are_typed_and_mint_nothing()
    8337      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8367      #[test]
    8368 -    fn stale_worker_completion_cannot_replace_a_newer_active_attempt()
    8368 +    fn dynamic_analysis_stale_execution_completion_cannot_replace_a_newer_attempt()
    8369      -> Result<(), Box<dyn std::error::Error>> {

  └ scripts/rust/quality_runner.py (+18 -0)
    3643          )
    3644 +        _cargo(
    3645 +            verified,
    3646 +            (
    3647 +                "test",
    3648 +                "-p",
    3649 +                "hormuz-app",
    3650 +                "--bin",
    3651 +                "hormuz-app",
    3652 +                "workbench::ui::tests::dynamic_analysis_",
    3653 +                "--locked",
    3654 +                "--offline",
    3655 +            ),
    3656 +            root,
    3657 +            execute,
    3658 +            lease=lease,
    3659 +            cargo_home=cargo_home,
    3660 +            dependency_execution=dependency_execution,
    3661 +        )
    3662      if lane == "model-validation":

• Ran ./scripts/quality/check-rust-quality-tests
  └ ..............................................................................................................DD005: arguments are forbidden; state_impact=none; retry_safe=yes; remediation=run the exact no-argument
    wrapper; --fix and --expand are unavailable
    … +12 lines (ctrl + t to view transcript)

    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The controller suite is green again: 412 tests plus both protected actual-executable probes pass, and it now proves the two exact dynamic commands. I’m running the real expanded dynamic gate; this is the product proof,
  not a proxy.

ⓘ This content can't be shown
  We take extra caution with cybersecurity requests. If you’re a security professional, you may be able to apply for Trusted Access.
  Trusted Access: https://openai.com/form/enterprise-trusted-access-for-cyber/
  Learn more: https://help.openai.com/en/articles/20001326```

### What steps can reproduce the bug?

Uploaded thread: 019f58ce-7b0f-7f53-9a05-d3586a8e0d4f

### What is the expected behavior?

It would be nice if I could workaround it rather than getting stuck. 

### Additional information

I first told codex it got stuck, and this was the result:
```codex-CLI-TUI
• Understood. The block is specific to the Honggfuzz/HFuzz work, and I will not try to route around it or rephrase the same implementation to evade the classifier.

  I’m durably reordering the roadmap so fuzzing is deferred until every other currently planned non-fuzz task is complete. No repository files were changed during the Honggfuzz investigation, so there is no partial
  harness, dependency, policy refresh, corpus, build tree, or producer to unwind. I’ll record the exact selected candidate and the sealed-source finding so the work can resume later without repeating the research, then
  move directly to dynamic-analysis and benchmark reconfirmation.

  Because this changes the canonical deferred-infrastructure ledger, I’m applying the repository’s agentic-config-check discipline: edit the .ai/ source, regenerate its declared outputs, and verify drift once—not begin a
  broader infrastructure audit.

• Updated Plan
  └ Per the user's directive, stable Honggfuzz work is deferred until every other currently planned non-fuzz task is complete. Resume immediately with the already-planned dynamic-analysis and benchmark reconfirmation.
    □ Reconfirm dynamic-analysis and benchmark lanes against the expanded application surface
    □ Implement the bounded release/profile proof without accumulating profiling artifacts
    □ Perform one final bounded review of integrated Phase 13 work and one focused repair pass for concrete findings
    □ Run final inventories and integration gates, warning before any visible UI check
    □ Complete roadmap and handoff documentation plus checkpoint commit
    □ Perform the deferred whole-tree named-intermediate/fallible-stage convergence refactor and its one bounded review
    □ Resume the stable bounded Honggfuzz smoke slice as the final deferred capability
    □ Run the post-fuzz final integration/handoff reconciliation and checkpoint

ⓘ This content can't be shown
  We take extra caution with cybersecurity requests. If you’re a security professional, you may be able to apply for Trusted Access.
  Trusted Access: https://openai.com/form/enterprise-trusted-access-for-cyber/
  Learn more: https://help.openai.com/en/articles/20001326

Then I tried again, and it blocked on the case that I then ran /feedback on:


• I see it. The second block confirms I should stop not only implementation but also detailed research/status discussion of that fuzzing tool for now.

  I’ll record only the user-directed task ordering in the existing roadmap and deferred ledger—without further tool-specific analysis—then continue with dynamic analysis and benchmarks. No attempt to resume that lane
  will occur until the other listed work is complete.

• Edited 2 files (+14 -7)
  └ .ai/deferred-infrastructure.json (+5 -4)
    373        "sourceRefs": ["docs/plans/0001-simulator-foundation-plan.md","docs/adr/0001-application-stack.md"],
    374 -      "statusRationale": "ADR 0001 authorizes stable-only bounded fuzzing once physical untrusted-input boundaries justify it.",
    374 +      "statusRationale": "ADR 0001 authorizes stable-only bounded fuzzing once physical untrusted-input boundaries justify it. On 2026-07-23 the user explicitly deferred this lane until every other currently pla
         nned non-fuzz task is complete.",
    375        "implementationState": "not-started",
        ⋮
    382        ],
    383 -      "nextMilestone": "Review and admit the stable fuzz tool for the now-implemented strict JSON and physical SCL1 boundaries, add bounded disposable seeds/campaign handling, and create the planned check-fuzz-s
         moke wrapper.",
    383 +      "nextMilestone": "After every other currently planned non-fuzz task is complete, resume the stable bounded tool review for the implemented strict JSON and physical SCL1 boundaries, add disposable seeds and
          campaign handling, and create the planned check-fuzz-smoke wrapper.",
    384        "blockingEvidence": [
    385 -        "No fuzz tool, fuzz target, disposable campaign contract, or check-fuzz-smoke wrapper exists."
    385 +        "No fuzz tool, fuzz target, disposable campaign contract, or check-fuzz-smoke wrapper exists.",
    386 +        "User-directed sequencing on 2026-07-23 requires this lane to remain deferred until all other currently planned non-fuzz work is complete."
    387        ],
        ⋮
    404        "status": "active",
    404 -      "lastReviewed": "2026-07-18"
    405 +      "lastReviewed": "2026-07-23"
    406      },

  └ docs/plans/0002-simulator-completion-roadmap.md (+9 -3)
    3499
    3500 -Fuzz, dynamic-analysis reconfirmation, benchmark reconfirmation, release, and
    3501 -profiling evidence continue next in requirement 6.
    3500 +At the user's explicit direction on 2026-07-23, fuzzing is deferred until every
    3501 +other currently planned non-fuzz task is complete. Dynamic-analysis
    3502 +reconfirmation, benchmark reconfirmation, release, profiling, the bounded
    3503 +integrated review, final inventories, handoff work, and the separately deferred
    3504 +fallible-stage convergence therefore continue first. The fuzz lane remains a
    3505 +required final deferred capability and must be followed by a last integration
    3506 +and handoff reconciliation; the sequencing change does not waive its acceptance
    3507 +criteria.
    3508
         ⋮
    4093  | `./scripts/quality/check-schemas`: JSON trigger already met; originally Phase 2. | Still required with the first physical SCL1 parser so it covers existing strict JSON plus binary format, compatibility, migra
          tion, and hostile-input contracts in one real boundary. | Phase 2. |
    4088 -| `./scripts/quality/check-fuzz-smoke`: originally Phase 2. | Still required only after the physical SCL1 parser exists and the stable fuzz tool is reviewed/admitted. Campaign state and targets remain disposabl
          e and bounded. | Phase 2 after the parser exists. |
    4094 +| `./scripts/quality/check-fuzz-smoke`: originally Phase 2. | Still required because the physical SCL1 parser exists, but the user explicitly deferred this lane on 2026-07-23 until every other currently planned
           non-fuzz task is complete. Campaign state and targets remain disposable and bounded; resume only at that final deferred milestone and then rerun integration and handoff reconciliation. | Final deferred capabil
          ity after all other currently planned non-fuzz work. |
    4095  | `./scripts/quality/check-data-provenance`: originally before Phase 5 defaults, expanded in Phase 6. | Implemented over the strict catalog parser plus complete graph, byte, license, checksum, transformation, c
          onflict, uncertainty, and applicability promotion suite. It runs through the verified offline Rust lane and is inherited by `check-full`; extend it with delayed epistemic-case ingestion and every later data sou
          rce. | Implemented in Phase 6; extend with every later data source. |

• Ran ./scripts/agentic/sync-configs
  └ Generated .codex/config.toml
    Generated .codex/rules/repository.rules
    … +30 lines (ctrl + t to view transcript)
    Generated .agents/skills/static-correctness/SKILL.md
    Generated .agents/skills/testing-discipline/SKILL.md

• Ran git status --short
  └  M .ai/deferred-infrastructure.json
     M docs/agentic/deferred-infrastructure.md
     M docs/plans/0002-simulator-completion-roadmap.md

• Ran git diff --check
  └ (no output)

• Ran ./scripts/agentic/validate-customizations
  └ Canonical repository Codex agents and skills are valid.

• Ran ./scripts/agentic/check-drift
  └ Agentic manifests, Codex wrappers, JSON, and generated outputs are in sync.

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The deferral is now durable and mechanically synchronized. Only the canonical ledger, its generated documentation, and the roadmap changed; customization validation, drift validation, and git diff --check all pass. I’m
  checkpointing this ordering decision now so the next product-assurance work starts from a clean recoverable state.

• Ran git add .ai/deferred-infrastructure.json docs/agentic/deferred-infrastructure.md docs/plans/0002-simulator-completion-roadmap.md
  └ (no output)

• Ran git diff --cached --stat
  └  .ai/deferred-infrastructure.json                |  9 +++++----
     docs/agentic/deferred-infrastructure.md         |  5 +++--
     docs/plans/0002-simulator-completion-roadmap.md | 12 +++++++++---
     3 files changed, 17 insertions(+), 9 deletions(-)

• Ran git commit -m "Defer fuzzing behind remaining assurance work" -m "Record the user's 2026-07-23 sequencing decision in the canonical deferred-infrastructure ledger and the completion roadmap. The fuzzing acceptance
  │ criteria remain required, but the lane now resumes only after every other currently planned non-fuzz task and is followed by final integration and handoff reconciliation." -m "Regenerate the deferred-infrastructure
  │ documentation from its .ai source so agentic discovery cannot drift from the ratified ordering. This checkpoint advances Phase 13 requirement 6 only by clarifying execution order; it does not claim a fuzz harness,
  │ … +3 lines
  └ ╭───────────────────────────────────────╮
    │ 🥊 lefthook v1.7.11  hook: pre-commit │
    … +11 lines (ctrl + t to view transcript)
    [main 3cfeb46] Defer fuzzing behind remaining assurance work
     3 files changed, 17 insertions(+), 9 deletions(-)

• Ran git log -1 --format=fuller
  └ commit 3cfeb46fcf3bce47f9fa25ab506bff8c9cfd32f0
    Author:     Alexander Riccio <test35965@gmail.com>
    … +12 lines (ctrl + t to view transcript)
        Validation: ./scripts/agentic/validate-customizations; ./scripts/agentic/check-drift; git diff --check. Immediate continuation: reconfirm dynamic-analysis and benchmark owners, then implement bounded release/
    profile evidence. Later work remains the bounded integrated review, inventories, handoff, fallible-stage convergence, and finally the deferred fuzz lane plus post-fuzz reconciliation.

• Ran git status --short --branch
  └ ## main

• Ran git diff --cached --quiet
  └ (no output)

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• Checkpoint 3cfeb46fcf3bce47f9fa25ab506bff8c9cfd32f0 durably records the user-directed deferral. The pre-commit quick gate passed; the index is empty; the tracked worktree is clean; and git status --short --branch
  reports only ## main, so there are no untracked files or omitted concurrent changes.

  Roadmap impact: this commit changes ordering only. Dynamic-analysis and benchmark reconfirmation are now active; release/profile evidence follows. The bounded integrated review, final inventories, handoff, whole-tree
  fallible-stage convergence, the last deferred fuzz capability, and post-fuzz integration/handoff reconciliation remain in that order. No blocker or acceptance criterion changed.

  I’m now comparing the existing dynamic and benchmark owners to the application changes landed since their last substantive extension, then I’ll run each exact gate sequentially so they do not compete for the governed
  Cargo cache.

• Explored
  └ Read check-benchmarks, check-dynamic-analysis

• Ran git log --oneline --max-count=30 -- scripts/quality/check-dynamic-analysis scripts/quality/check-benchmarks scripts/rust/quality_runner.py crates/hormuz-app crates/hormuz-engine crates/hormuz-analysis
  └ b5436fc Add bounded stable Rust mutation proof
    1ea9292 Ratchet stable Rust coverage evidence
    … +26 lines (ctrl + t to view transcript)
    4fff11b Reject missing model provenance before promotion
    f763e14 Reject unsupported simulation versions

• Explored
  └ Search dynamic-analysis|benchmark|capacity|fault|panic|cancel|allocation|replay seek|artifact in quality
    Search dynamic|benchmark in tests
    Search dynamic-analysis|benchmark in quality_runner.py
    Read simulation_benchmark.py, test_rust_quality.py
    Search dynamic_analysis_|workbench.*panic|publication.*panic|detail.*panic|cancellation in hormuz-app
    Read test_rust_quality.py

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The comparison found a real, bounded gap rather than a reason to redesign the lane:

  - the benchmark owner already measures the representative run/replay, 1-vs-8-worker ensemble, GPU candidate audit/restart observations, and the locked large-workbench semantic frame/replay-seek capacity;
  - the dynamic owner still selects only the original ensemble worker-start/panic/cancellation tests, even though later product work added supervised workbench execution, atomic publication, run-detail, and comparison
    cancellation/panic boundaries.

  I’m adding only those later product-owned fault tests to the existing dynamic lane. I’ll make the selector test fail first, then update the owner and run the exact dynamic gate. The benchmark lane needs reconfirmation,
  not another metric family, unless its real run exposes a concrete gap.

• Explored
  └ Read quality_runner.py
    Search benchmark-v3|workbench_capacity|check-benchmarks|dynamic-analysis in development
    Search ^    fn .*(cancell|panic|worker|stale|lost) in ensemble.rs
    Search ^    fn .*(cancell|panic|worker|stale|lost) in workbench
    Read deferred-infrastructure.json, dynamic-analysis.md, rust-toolchain.md
    Search fn .*(worker|panic|cancel|stale|lost) in detail.rs
    Search run detail|comparison.*panic|worker.*lost|worker.*start in ui.rs
    Read ui.rs
    List hormuz-app
    Search ^    fn .*(report|video|detail|comparison).*(fail|panic|lost|start|cancel|stale)|^    fn .*(fail|panic|lost|start|cancel|stale).*(report|video|detail|comparison) in ui.rs
    Search ^    fn  in ui.rs

• Edited scripts/quality/tests/test_rust_quality.py (+10 -0)
    5083                  ),
    5084 +                (
    5085 +                    "test",
    5086 +                    "-p",
    5087 +                    "hormuz-app",
    5088 +                    "--bin",
    5089 +                    "hormuz-app",
    5090 +                    "workbench::ui::tests::dynamic_analysis_",
    5091 +                    "--locked",
    5092 +                    "--offline",
    5093 +                ),
    5094              ],

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The selector contract is now intentionally red: it requires the existing dynamic owner to run both the original ensemble fault family and a new workbench fault family. I’m running the owning controller tests to confirm
  the failure is exactly the absent second command before changing implementation or test names.

• Waited for background terminal · ./scripts/quality/check-rust-quality-tests

• Ran ./scripts/quality/check-rust-quality-tests
  └ ..............................................................................................................DD005: arguments are forbidden; state_impact=none; retry_safe=yes; remediation=run the exact no-argument
    wrapper; --fix and --expand are unavailable
    … +47 lines (ctrl + t to view transcript)

    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The red proof failed exactly as intended: the only failure among 412 controller tests is that the dynamic owner emitted the original ensemble command but not the required workbench command. I’m now wiring that command
  and giving the seven already-existing workbench fault tests a common dynamic_analysis_ selector prefix; no production behavior or assertion is being rewritten.

• Edited 2 files (+25 -7)
  └ crates/hormuz-app/src/workbench/ui.rs (+7 -7)
    7959      #[test]
    7960 -    fn cancellation_wins_the_terminal_commit_and_discards_completed_worker_output()
    7960 +    fn dynamic_analysis_execution_cancellation_wins_and_discards_completed_worker_output()
    7961      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    7998      #[test]
    7999 -    fn cancellation_during_execution_preserves_progress_and_mints_no_result_or_artifact()
    7999 +    fn dynamic_analysis_execution_cancellation_preserves_progress_and_mints_nothing()
    8000      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8087      #[test]
    8088 -    fn cancellation_after_finalization_removes_staging_and_never_publishes()
    8088 +    fn dynamic_analysis_publication_cancellation_removes_finalized_staging()
    8089      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8174      #[test]
    8175 -    fn successful_publication_wins_a_cancellation_race_after_atomic_visibility()
    8175 +    fn dynamic_analysis_atomic_visibility_wins_the_publication_cancellation_race()
    8176      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8261      #[test]
    8262 -    fn publication_worker_panic_after_finalization_discards_staging_and_mints_no_success()
    8262 +    fn dynamic_analysis_publication_worker_panic_discards_finalized_staging()
    8263      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8335      #[test]
    8336 -    fn worker_failure_and_panic_are_typed_and_cannot_mint_a_result()
    8336 +    fn dynamic_analysis_execution_failure_and_panic_are_typed_and_mint_nothing()
    8337      -> Result<(), Box<dyn std::error::Error>> {
         ⋮
    8367      #[test]
    8368 -    fn stale_worker_completion_cannot_replace_a_newer_active_attempt()
    8368 +    fn dynamic_analysis_stale_execution_completion_cannot_replace_a_newer_attempt()
    8369      -> Result<(), Box<dyn std::error::Error>> {

  └ scripts/rust/quality_runner.py (+18 -0)
    3643          )
    3644 +        _cargo(
    3645 +            verified,
    3646 +            (
    3647 +                "test",
    3648 +                "-p",
    3649 +                "hormuz-app",
    3650 +                "--bin",
    3651 +                "hormuz-app",
    3652 +                "workbench::ui::tests::dynamic_analysis_",
    3653 +                "--locked",
    3654 +                "--offline",
    3655 +            ),
    3656 +            root,
    3657 +            execute,
    3658 +            lease=lease,
    3659 +            cargo_home=cargo_home,
    3660 +            dependency_execution=dependency_execution,
    3661 +        )
    3662      if lane == "model-validation":

• Ran ./scripts/quality/check-rust-quality-tests
  └ ..............................................................................................................DD005: arguments are forbidden; state_impact=none; retry_safe=yes; remediation=run the exact no-argument
    wrapper; --fix and --expand are unavailable
    … +12 lines (ctrl + t to view transcript)

    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

• The controller suite is green again: 412 tests plus both protected actual-executable probes pass, and it now proves the two exact dynamic commands. I’m running the real expanded dynamic gate; this is the product proof,
  not a proxy.

ⓘ This content can't be shown
  We take extra caution with cybersecurity requests. If you’re a security professional, you may be able to apply for Trusted Access.
  Trusted Access: https://openai.com/form/enterprise-trusted-access-for-cyber/
  Learn more: https://help.openai.com/en/articles/20001326

Please tell/promise me that honestly trying to avoid non-allowed work will not get my account banned?!

Dominant language
Rust
Stars
125k
Forks
19.5k
Avg merge
1m
Merged PRs (30d)
1k

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from openai/codex

All issues in openai/codex

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.