certfix 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. {certfix-0.2.0 → certfix-0.3.0}/.certfix.yaml.example +69 -69
  2. certfix-0.3.0/.gitattributes +6 -0
  3. {certfix-0.2.0 → certfix-0.3.0}/.github/workflows/ci.yml +2 -0
  4. {certfix-0.2.0 → certfix-0.3.0}/.github/workflows/docker.yml +2 -1
  5. {certfix-0.2.0 → certfix-0.3.0}/.gitignore +82 -82
  6. certfix-0.3.0/AGENTS.md +111 -0
  7. {certfix-0.2.0 → certfix-0.3.0}/Dockerfile +4 -2
  8. {certfix-0.2.0 → certfix-0.3.0}/LICENSE +21 -21
  9. certfix-0.3.0/PKG-INFO +381 -0
  10. certfix-0.3.0/README.md +344 -0
  11. {certfix-0.2.0 → certfix-0.3.0}/RELEASE_NOTES.md +44 -1
  12. {certfix-0.2.0 → certfix-0.3.0}/THIRD_PARTY_NOTICES.md +32 -32
  13. {certfix-0.2.0 → certfix-0.3.0}/configs/deepseek-v4-flash-api.yaml +79 -79
  14. {certfix-0.2.0/src/certfix → certfix-0.3.0}/configs/deepseek-v4-flash-openrouter.yaml +82 -82
  15. {certfix-0.2.0/src/certfix → certfix-0.3.0}/configs/examples/deepseek-gemini-step-overrides.yaml +97 -97
  16. certfix-0.3.0/configs/examples/local-detection-deepseek-fix-docker.yaml +78 -0
  17. {certfix-0.2.0/src/certfix → certfix-0.3.0}/configs/examples/local-detection-deepseek-fix.yaml +80 -79
  18. {certfix-0.2.0/src/certfix → certfix-0.3.0}/configs/gemini-3-flash-preview-openrouter.yaml +76 -76
  19. {certfix-0.2.0 → certfix-0.3.0}/configs/qwen36-mtp-check.yaml +37 -29
  20. certfix-0.3.0/docker/certfix-entrypoint.sh +14 -0
  21. certfix-0.3.0/docker/llama-server/Dockerfile +36 -0
  22. certfix-0.3.0/docker/llama-server/entrypoint.sh +25 -0
  23. certfix-0.3.0/docker-compose.api.yml +11 -0
  24. certfix-0.3.0/docker-compose.local-qwen36.yml +62 -0
  25. {certfix-0.2.0 → certfix-0.3.0}/docs/ARCHITECTURE.md +6 -6
  26. {certfix-0.2.0 → certfix-0.3.0}/docs/BENCHMARK_SUMMARY.md +136 -133
  27. {certfix-0.2.0 → certfix-0.3.0}/docs/CONFIGURATION.md +7 -0
  28. {certfix-0.2.0 → certfix-0.3.0}/docs/CONTRIBUTING.md +98 -98
  29. certfix-0.3.0/docs/DOCKER.md +406 -0
  30. {certfix-0.2.0 → certfix-0.3.0}/docs/EXAMPLE_OUTPUT.md +4 -0
  31. {certfix-0.2.0 → certfix-0.3.0}/docs/INDEX.md +12 -9
  32. certfix-0.3.0/docs/INSTALLATION.md +192 -0
  33. certfix-0.3.0/docs/LIMITATIONS.md +48 -0
  34. {certfix-0.2.0 → certfix-0.3.0}/docs/MODEL_SMOKE_SUITE.md +113 -113
  35. {certfix-0.2.0 → certfix-0.3.0}/docs/QWEN36_MTP_RUNTIME.md +3 -4
  36. {certfix-0.2.0 → certfix-0.3.0}/docs/RELEASE_CHECKLIST.md +12 -4
  37. {certfix-0.2.0 → certfix-0.3.0}/docs/RESEARCH_NOTES.md +49 -49
  38. {certfix-0.2.0 → certfix-0.3.0}/docs/SUPPORTED_RULES.md +74 -74
  39. {certfix-0.2.0 → certfix-0.3.0}/examples/input/mem30_use_after_free.c +27 -27
  40. {certfix-0.2.0 → certfix-0.3.0}/examples/input/multi_rule_vulnerabilities.c +32 -32
  41. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/clean_print.c +5 -5
  42. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/exp33_uninitialized_read.c +7 -7
  43. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/exp34_null_deref.c +5 -5
  44. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/mem30_use_after_free.c +12 -12
  45. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/mem35_short_alloc.c +11 -11
  46. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/multi_file_mem30/helpers.c +5 -5
  47. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/multi_file_mem30/helpers.h +8 -8
  48. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/multi_file_mem30/main.c +14 -14
  49. {certfix-0.2.0 → certfix-0.3.0}/model-smoke-cases/multi_function_mem30.c +24 -24
  50. {certfix-0.2.0 → certfix-0.3.0}/pyproject.toml +2 -1
  51. {certfix-0.2.0 → certfix-0.3.0}/scripts/check_release_readiness.py +14 -0
  52. {certfix-0.2.0 → certfix-0.3.0}/scripts/run_model_smoke_suite.py +396 -396
  53. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/__init__.py +1 -1
  54. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/__main__.py +6 -6
  55. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/cli.py +19 -12
  56. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/config.py +375 -375
  57. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/deepseek-v4-flash-api.yaml +79 -79
  58. {certfix-0.2.0 → certfix-0.3.0/src/certfix}/configs/deepseek-v4-flash-openrouter.yaml +82 -82
  59. {certfix-0.2.0 → certfix-0.3.0/src/certfix}/configs/examples/deepseek-gemini-step-overrides.yaml +97 -97
  60. certfix-0.3.0/src/certfix/configs/examples/local-detection-deepseek-fix-docker.yaml +78 -0
  61. {certfix-0.2.0 → certfix-0.3.0/src/certfix}/configs/examples/local-detection-deepseek-fix.yaml +80 -79
  62. {certfix-0.2.0 → certfix-0.3.0/src/certfix}/configs/gemini-3-flash-preview-openrouter.yaml +76 -76
  63. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/qwen36-mtp-check.yaml +37 -29
  64. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/qwen36-mtp-local.yaml +1 -1
  65. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/__init__.py +26 -26
  66. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/detector.py +209 -209
  67. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/fix_validator.py +335 -335
  68. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/fixer.py +92 -92
  69. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/include_resolver.py +113 -113
  70. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/preprocessor.py +133 -133
  71. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/rule_selection_cards.py +546 -546
  72. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/simple_repair.py +244 -244
  73. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/splitter.py +245 -245
  74. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/validate_guided_retry.py +278 -278
  75. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/validation.py +677 -677
  76. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/data/__init__.py +1 -1
  77. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/data/cert_c_rules_with_examples.json +211 -211
  78. certfix-0.3.0/src/certfix/docker_wrapper.py +229 -0
  79. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/env.py +47 -47
  80. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/exceptions.py +43 -43
  81. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/inference/__init__.py +10 -10
  82. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/inference/api.py +855 -855
  83. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/inference/base.py +55 -55
  84. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/inference/factory.py +160 -160
  85. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/inference/parsing.py +371 -371
  86. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/models.py +322 -322
  87. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/output.py +490 -490
  88. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/prompt_profiles.py +426 -426
  89. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/prompts.py +734 -734
  90. {certfix-0.2.0 → certfix-0.3.0}/tests/__init__.py +1 -1
  91. {certfix-0.2.0 → certfix-0.3.0}/tests/conftest.py +50 -50
  92. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/clean_no_violation.c +13 -13
  93. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/exp33_uninitialized.c +7 -7
  94. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/exp33_uninitialized.violations.json +11 -11
  95. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/mem30_use_after_free.c +11 -11
  96. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/mem30_use_after_free.violations.json +11 -11
  97. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/multi_file.violations.json +29 -29
  98. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/sarif-schema-2.1.0.json +3389 -3389
  99. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/str31_buffer_overflow.c +9 -9
  100. {certfix-0.2.0 → certfix-0.3.0}/tests/fixtures/str31_buffer_overflow.violations.json +11 -11
  101. {certfix-0.2.0 → certfix-0.3.0}/tests/integration/__init__.py +1 -1
  102. {certfix-0.2.0 → certfix-0.3.0}/tests/integration/test_cli.py +42 -3
  103. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/__init__.py +1 -1
  104. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_api_backend.py +713 -713
  105. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_build_prompt.py +188 -188
  106. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_config.py +258 -258
  107. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_detector.py +388 -388
  108. certfix-0.3.0/tests/unit/test_docker_wrapper.py +188 -0
  109. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_env.py +51 -51
  110. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_factory.py +331 -331
  111. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_fix_validator.py +259 -259
  112. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_include_resolver.py +128 -128
  113. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_models.py +160 -160
  114. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_output.py +85 -85
  115. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_parsing.py +191 -191
  116. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_preprocessor.py +79 -79
  117. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_prompt_profiles.py +195 -195
  118. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_rule_selection_cards.py +110 -110
  119. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_sarif.py +1 -1
  120. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_simple_repair.py +170 -170
  121. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_splitter.py +156 -156
  122. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_validate_guided_retry.py +191 -191
  123. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_validation.py +786 -786
  124. certfix-0.2.0/AGENTS.md +0 -43
  125. certfix-0.2.0/PKG-INFO +0 -555
  126. certfix-0.2.0/README.md +0 -518
  127. certfix-0.2.0/docker-compose.api.yml +0 -12
  128. certfix-0.2.0/docker-compose.local-qwen36.yml +0 -50
  129. certfix-0.2.0/docs/DOCKER.md +0 -152
  130. {certfix-0.2.0 → certfix-0.3.0}/.dockerignore +0 -0
  131. {certfix-0.2.0 → certfix-0.3.0}/SECURITY.md +0 -0
  132. {certfix-0.2.0 → certfix-0.3.0}/configs/qwen36-mtp-docker.yaml +0 -0
  133. {certfix-0.2.0 → certfix-0.3.0}/configs/qwen36-mtp-local.yaml +0 -0
  134. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/__init__.py +0 -0
  135. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/examples/__init__.py +0 -0
  136. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/configs/qwen36-mtp-docker.yaml +0 -0
  137. {certfix-0.2.0 → certfix-0.3.0}/src/certfix/core/programmatic_checks.py +0 -0
  138. {certfix-0.2.0 → certfix-0.3.0}/tests/unit/test_programmatic_checks.py +0 -0
@@ -1,69 +1,69 @@
1
- # certfix configuration example
2
- #
3
- # Recommended setup:
4
- #
5
- # certfix config qwen36-mtp-local --output .certfix.yaml
6
- #
7
- # This checked-in example mirrors the v0.1.0 local Qwen3.6 MTP profile. Start an
8
- # MTP-capable llama.cpp server before running `certfix check` or `certfix fix`.
9
- # The server must support `--spec-type draft-mtp`.
10
-
11
- detection:
12
- backend: local_llama_server
13
- prompt_profile: qwen36_certfix_check_v1
14
- batch_size: 1
15
- qwen36_rule_id_strategy: sequential_top2_p3
16
- qwen36_selector_candidate_k: 2
17
- qwen36_selector_permutations: 3
18
- api:
19
- base_url: http://127.0.0.1:8952/v1
20
- model: unsloth/Qwen3.6-27B-MTP-GGUF:UD-Q4_K_XL
21
- api_key_env: ""
22
- timeout: 300
23
- max_tokens: 1024
24
- temperature: 0.0
25
-
26
- models:
27
- qwen36_local:
28
- backend: local_llama_server
29
- profile: qwen36_27b_local
30
- max_tokens: 4096
31
- temperature: 0.0
32
- api:
33
- base_url: http://127.0.0.1:8952/v1
34
- model: unsloth/Qwen3.6-27B-MTP-GGUF:UD-Q4_K_XL
35
- api_key_env: ""
36
- timeout: 300
37
- max_tokens: 4096
38
- temperature: 0.0
39
-
40
- validation:
41
- compile:
42
- enabled: true
43
- command: gcc
44
- args: ["-fsyntax-only"]
45
- include_paths: []
46
- timeout: 30
47
- violation_removal:
48
- enabled: true
49
- detector_role: qwen36_local
50
- method: non_target_advisory
51
- max_tokens: 512
52
- override_denylist: ["SIG34-C", "STR31-C"]
53
- semantic:
54
- enabled: true
55
- reviewer_role: qwen36_local
56
- block_on_uncertain: true
57
-
58
- fix:
59
- simple_repairer_role: qwen36_local
60
- simple_repair_profile: qwen36_27b_complete_repair_rule_guided_v1
61
- simple_max_tokens: 4096
62
- validate_guided_retry: true
63
- retry_max_attempts: 1
64
- retry_max_tokens: 4096
65
- retry_rule_addenda_v1: true
66
- retry_rule_addenda_rule_ids: ["ARR37-C", "CON31-C", "POS48-C", "SIG30-C", "ENV33-C"]
67
-
68
- check:
69
- exclude: []
1
+ # certfix configuration example
2
+ #
3
+ # Recommended setup:
4
+ #
5
+ # certfix config qwen36-mtp-local --output .certfix.yaml
6
+ #
7
+ # This checked-in example mirrors the v0.1.0 local Qwen3.6 MTP profile. Start an
8
+ # MTP-capable llama.cpp server before running `certfix check` or `certfix fix`.
9
+ # The server must support `--spec-type draft-mtp`.
10
+
11
+ detection:
12
+ backend: local_llama_server
13
+ prompt_profile: qwen36_certfix_check_v1
14
+ batch_size: 1
15
+ qwen36_rule_id_strategy: sequential_top2_p3
16
+ qwen36_selector_candidate_k: 2
17
+ qwen36_selector_permutations: 3
18
+ api:
19
+ base_url: http://127.0.0.1:8952/v1
20
+ model: unsloth/Qwen3.6-27B-MTP-GGUF:UD-Q4_K_XL
21
+ api_key_env: ""
22
+ timeout: 300
23
+ max_tokens: 1024
24
+ temperature: 0.0
25
+
26
+ models:
27
+ qwen36_local:
28
+ backend: local_llama_server
29
+ profile: qwen36_27b_local
30
+ max_tokens: 4096
31
+ temperature: 0.0
32
+ api:
33
+ base_url: http://127.0.0.1:8952/v1
34
+ model: unsloth/Qwen3.6-27B-MTP-GGUF:UD-Q4_K_XL
35
+ api_key_env: ""
36
+ timeout: 300
37
+ max_tokens: 4096
38
+ temperature: 0.0
39
+
40
+ validation:
41
+ compile:
42
+ enabled: true
43
+ command: gcc
44
+ args: ["-fsyntax-only"]
45
+ include_paths: []
46
+ timeout: 30
47
+ violation_removal:
48
+ enabled: true
49
+ detector_role: qwen36_local
50
+ method: non_target_advisory
51
+ max_tokens: 512
52
+ override_denylist: ["SIG34-C", "STR31-C"]
53
+ semantic:
54
+ enabled: true
55
+ reviewer_role: qwen36_local
56
+ block_on_uncertain: true
57
+
58
+ fix:
59
+ simple_repairer_role: qwen36_local
60
+ simple_repair_profile: qwen36_27b_complete_repair_rule_guided_v1
61
+ simple_max_tokens: 4096
62
+ validate_guided_retry: true
63
+ retry_max_attempts: 1
64
+ retry_max_tokens: 4096
65
+ retry_rule_addenda_v1: true
66
+ retry_rule_addenda_rule_ids: ["ARR37-C", "CON31-C", "POS48-C", "SIG30-C", "ENV33-C"]
67
+
68
+ check:
69
+ exclude: []
@@ -0,0 +1,6 @@
1
+ * text=auto
2
+
3
+ *.sh text eol=lf
4
+ Dockerfile text eol=lf
5
+ *.yml text eol=lf
6
+ *.yaml text eol=lf
@@ -58,6 +58,7 @@ jobs:
58
58
  /tmp/certfix-wheel-smoke/bin/python -m pip install --upgrade pip
59
59
  /tmp/certfix-wheel-smoke/bin/python -m pip install dist/*.whl
60
60
  /tmp/certfix-wheel-smoke/bin/certfix --help
61
+ /tmp/certfix-wheel-smoke/bin/certfix-docker --help
61
62
  /tmp/certfix-wheel-smoke/bin/certfix config --list
62
63
  /tmp/certfix-wheel-smoke/bin/certfix config qwen36-mtp-local --output /tmp/certfix-smoke.yaml
63
64
  test -s /tmp/certfix-smoke.yaml
@@ -67,4 +68,5 @@ jobs:
67
68
  run: |
68
69
  docker build -t certfix-ci .
69
70
  docker run --rm certfix-ci --help
71
+ docker run --rm certfix-ci certfix-docker --help
70
72
  docker run --rm certfix-ci config --list
@@ -67,11 +67,12 @@ jobs:
67
67
  tags: ${{ steps.image.outputs.tags }}
68
68
  labels: |
69
69
  org.opencontainers.image.source=https://github.com/${{ github.repository }}
70
- org.opencontainers.image.description=certfix API-only CLI image
70
+ org.opencontainers.image.description=certfix CLI image for API, local, and hybrid routes
71
71
  org.opencontainers.image.licenses=MIT
72
72
 
73
73
  - name: Smoke test published image
74
74
  run: |
75
75
  first_tag="$(printf '%s\n' "${{ steps.image.outputs.tags }}" | head -n 1)"
76
76
  docker run --rm "${first_tag}" --help
77
+ docker run --rm "${first_tag}" certfix-docker --help
77
78
  docker run --rm "${first_tag}" config --list
@@ -1,82 +1,82 @@
1
- # Python
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
- *.so
6
- .Python
7
- build/
8
- develop-eggs/
9
- dist/
10
- downloads/
11
- eggs/
12
- .eggs/
13
- lib/
14
- lib64/
15
- parts/
16
- sdist/
17
- var/
18
- wheels/
19
- *.egg-info/
20
- .installed.cfg
21
- *.egg
22
-
23
- # Virtual environments
24
- .env
25
- .venv
26
- env/
27
- venv/
28
- ENV/
29
-
30
- # IDE
31
- .idea/
32
- .vscode/
33
- *.swp
34
- *.swo
35
- *~
36
-
37
- # Testing
38
- .tox/
39
- .nox/
40
- .coverage
41
- .coverage.*
42
- htmlcov/
43
- .pytest_cache/
44
- model-smoke-results/
45
- .mypy_cache/
46
-
47
- # certfix-generated reports, fixed-code candidates, and patches
48
- certfix-output/
49
-
50
- # Local model smoke configs
51
- configs/local-*.yaml
52
- configs/local-*.yml
53
-
54
- # Build
55
- *.manifest
56
- *.spec
57
-
58
- # Installer logs
59
- pip-log.txt
60
- pip-delete-this-directory.txt
61
-
62
- # Models (large files)
63
- *.gguf
64
- *.bin
65
- models/
66
-
67
- # MCP (local tool config)
68
- .mcp.json
69
- mcp-servers/
70
-
71
- # OS
72
- .DS_Store
73
- Thumbs.db
74
-
75
- # Local/private maintainer notes not included in the initial public repo
76
- docs/research-archive/
77
- CLAUDE.md
78
- README.ja.local.md
79
-
80
- # Locally generated maintainer evaluation datasets
81
- src/certfix/data/*samples.jsonl.gz
82
- eval-splits/
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ .env
25
+ .venv
26
+ env/
27
+ venv/
28
+ ENV/
29
+
30
+ # IDE
31
+ .idea/
32
+ .vscode/
33
+ *.swp
34
+ *.swo
35
+ *~
36
+
37
+ # Testing
38
+ .tox/
39
+ .nox/
40
+ .coverage
41
+ .coverage.*
42
+ htmlcov/
43
+ .pytest_cache/
44
+ model-smoke-results/
45
+ .mypy_cache/
46
+
47
+ # certfix-generated reports, fixed-code candidates, and patches
48
+ certfix-output/
49
+
50
+ # Local model smoke configs
51
+ configs/local-*.yaml
52
+ configs/local-*.yml
53
+
54
+ # Build
55
+ *.manifest
56
+ *.spec
57
+
58
+ # Installer logs
59
+ pip-log.txt
60
+ pip-delete-this-directory.txt
61
+
62
+ # Models (large files)
63
+ *.gguf
64
+ *.bin
65
+ models/
66
+
67
+ # MCP (local tool config)
68
+ .mcp.json
69
+ mcp-servers/
70
+
71
+ # OS
72
+ .DS_Store
73
+ Thumbs.db
74
+
75
+ # Local/private maintainer notes not included in the initial public repo
76
+ docs/research-archive/
77
+ CLAUDE.md
78
+ README.ja.local.md
79
+
80
+ # Locally generated maintainer evaluation datasets
81
+ src/certfix/data/*samples.jsonl.gz
82
+ eval-splits/
@@ -0,0 +1,111 @@
1
+ # certfix Public Release Notes For Agents
2
+
3
+ This repository is the release-side workspace for `certfix`, a CLI for detecting
4
+ and repairing CERT-C issues in C source code.
5
+
6
+ ## Public Boundary
7
+
8
+ - Treat this repository as publishable. Do not add local absolute paths,
9
+ private keys, model checkpoints, evaluation datasets, cloud run details, or
10
+ internal experiment logs.
11
+ - The initial public repository intentionally excludes `docs/research-archive/`
12
+ and local scratchpad files such as `CLAUDE.md`.
13
+ - Research provenance belongs in internal project records or a separately
14
+ sanitized archive, not in the primary public docs.
15
+ - SFT artifacts and experiment-side datasets are not required for normal
16
+ v0.1.0 usage.
17
+
18
+ ## Release Path
19
+
20
+ - The public v0.1.0 path is Qwen3.6-centered.
21
+ - The main local config is `configs/qwen36-mtp-local.yaml`.
22
+ - `certfix fix` uses the public Qwen3.6-centered repair path.
23
+ - API profiles are optional and send source code to the configured provider.
24
+
25
+ ## Release Traceability
26
+
27
+ - Public release tags such as `v0.1.0` belong to the public repository
28
+ `safe-c-ai/certfix`.
29
+ - The development repository must use a separate source tag for each public
30
+ release, named `public/vX.Y.Z-source`.
31
+ - Record the public tag/SHA and development source tag/SHA mapping in
32
+ `docs/research-archive/RELEASE_TRACEABILITY.md`.
33
+ - Do not keep ambiguous `vX.Y.Z` release tags in `certfix-dev`.
34
+ - Before deciding whether current work belongs to an already-published release
35
+ or the next release, verify the live release state instead of relying on
36
+ memory or conversation context.
37
+ - Last live release check before the current next-release work on 2026-06-02:
38
+ - `safe-c-ai/certfix` latest GitHub Release: `v0.2.0`.
39
+ - `safe-c-ai/certfix-dev` latest public source tag: `public/v0.2.0-source`.
40
+ Treat later local changes as next-release work unless the user explicitly
41
+ says they are patching an already-published release.
42
+ - Use these checks before editing release notes, version docs, tags, or release
43
+ instructions:
44
+
45
+ ```bash
46
+ python3 - <<'PY'
47
+ import json
48
+ import urllib.request
49
+
50
+ repo = "safe-c-ai/certfix"
51
+ url = f"https://api.github.com/repos/{repo}/releases/latest"
52
+ with urllib.request.urlopen(url, timeout=15) as response:
53
+ release = json.load(response)
54
+ print(f"{repo} latest GitHub Release: {release['tag_name']}")
55
+ PY
56
+
57
+ git ls-remote --tags dev 'refs/tags/public/v*' 'refs/tags/v*' | sort -V
58
+ ```
59
+
60
+ - `safe-c-ai/certfix-dev` may not expose GitHub Releases through the public API.
61
+ In that case, use the `public/vX.Y.Z-source` remote tags as the dev-side
62
+ release traceability state.
63
+ - Do not rewrite release notes for an already-published public version to
64
+ describe new unreleased work. Add a new top-level section for the next release
65
+ instead.
66
+ - Release order is review-gated. For substantial README, docs, Docker,
67
+ packaging, release-note, or public-boundary changes, do not treat the work as
68
+ ready to publish until the user has reviewed the changed files or a sanitized
69
+ review archive and explicitly approved proceeding.
70
+ - The normal order for substantial public-facing changes is:
71
+ 1. Implement changes in `certfix-dev`.
72
+ 2. Run local consistency checks that do not publish anything.
73
+ 3. Create a sanitized review archive, excluding local scratchpads, private
74
+ research archives, evaluation splits, generated sample datasets, secrets,
75
+ and local-only files.
76
+ 4. Wait for user review and approval.
77
+ 5. Only after approval, prepare release notes, public sync, tags, GitHub
78
+ Release, PyPI, or GHCR publishing steps.
79
+ - If the user asks "what next?" after implementation but before review, the next
80
+ step is review preparation and review, not publication or release finalization.
81
+
82
+ ## Git And GitHub Guidance
83
+
84
+ - When giving the user Git or GitHub operation commands, explain what each
85
+ command does, which repository/branch/tag it affects, and whether it is
86
+ destructive or hard to undo.
87
+ - For push, tag, release, visibility, deletion, force, reset, rebase, merge,
88
+ checkout/restore, clean, or branch deletion operations, include the expected
89
+ pre-check and post-check commands.
90
+ - Prefer explicit repository paths in instructions when both `certfix-dev` and
91
+ `certfix-public` are involved.
92
+
93
+ ## Documentation Wording
94
+
95
+ - Prefer cautious claims: validation gates reduce risk; they do not guarantee
96
+ behavior equivalence or security correctness.
97
+ - Benchmark claims should point to `docs/BENCHMARK_SUMMARY.md` and keep its
98
+ caveats intact.
99
+ - Do not present historical model names, old benchmark values, or archived
100
+ decisions as current release defaults.
101
+
102
+ ## Development Commands
103
+
104
+ ```bash
105
+ pip install -e ".[dev]"
106
+ pytest
107
+ ruff check src/ tests/ scripts/
108
+ ruff format src/ tests/ scripts/
109
+ python3 -m build --sdist --wheel
110
+ python3 scripts/check_release_readiness.py
111
+ ```
@@ -14,11 +14,13 @@ WORKDIR /opt/certfix
14
14
 
15
15
  COPY pyproject.toml README.md LICENSE THIRD_PARTY_NOTICES.md ./
16
16
  COPY src ./src
17
+ COPY docker/certfix-entrypoint.sh /usr/local/bin/certfix-entrypoint
17
18
 
18
19
  RUN python -m pip install --no-cache-dir --upgrade pip \
19
- && python -m pip install --no-cache-dir .
20
+ && python -m pip install --no-cache-dir . \
21
+ && chmod +x /usr/local/bin/certfix-entrypoint
20
22
 
21
23
  WORKDIR /workspace
22
24
 
23
- ENTRYPOINT ["certfix"]
25
+ ENTRYPOINT ["certfix-entrypoint"]
24
26
  CMD ["--help"]
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 certfix team
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 certfix team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.