Brostoffed/writemark
- Repository: https://github.com/Brostoffed/writemark
- Commit:
ad67772b9dfbd2e94b0eb52628916a624ea6c995 - Generated: 2026-11-13T23:57:28+00:00
- Scorer 0.1.0, scoring prov-4+qual-2+sec-2, report schema v2
Scores
| Pillar | Score | Signal | Confidence | Coverage |
|---|---|---|---|---|
| AI provenance (estimated AI-generated share) | 42 | explicit | 81% | 100% |
| Code quality | 73 | adequate | 90% | 100% |
| Security | 57 | weak | 85% | 100% |
AI provenance
Explicit AI attribution on 41% of first-party code added; an estimated 41% including velocity signals.
- Explicitly attributed share (lower bound): 41.5%
- Unattributed share in AI-consistent velocity bursts: 24.7%
- Estimated AI-generated share: 41.5%
| AI tool | Attributed commits | Lines added |
|---|---|---|
| OpenAI Codex | 12 | 12,160 |
- AI tooling configured in repo: generic-agent
Current source lines last changed by AI-attributed commits: 8,404 of 9,008.
| Findings per 1,000 lines | AI-attributed | Other | Ratio |
|---|---|---|---|
| Quality | 6.307 | 0.0 | n/a |
| Security | 8.329 | 3.311 | 2.52x |
| Month | Lines added | Attributed to AI |
|---|---|---|
| 2026-06 | 4,467 | 0% |
| 2026-07 | 11,471 | 0% |
| 2026-08 | 1,994 | 89% |
| 2026-09 | 459 | 100% |
| 2026-10 | 10,938 | 91% |
Evidence
- OpenAI Codex: on merged branch (ad67772b9d) (cbd3711b22ba)
- OpenAI Codex: on merged branch (ad67772b9d) (0f1940f64901)
- OpenAI Codex: on merged branch (ad67772b9d) (bd564285ca14)
- OpenAI Codex: on merged branch (f05a12f29c) (a47581914644)
- OpenAI Codex: on merged branch (f05a12f29c) (5611153f6f92)
- OpenAI Codex: on merged branch (2dc0d46c29) (0c857bcce529)
- OpenAI Codex: on merged branch (2dc0d46c29) (f6e03e731981)
- OpenAI Codex: on merged branch (2dc0d46c29) (9fa79cf4d8f2)
- OpenAI Codex: on merged branch (45af335825) (a728275f7db3)
- OpenAI Codex: on merged branch (45af335825) (1b61bfdf0aed)
- OpenAI Codex: on merged branch (45af335825) (d0f795da3c95)
- OpenAI Codex: on merged branch (45af335825) (9b8f89d9122f)
- AGENTS.md (generic-agent configuration) (AGENTS.md)
- v1.4.1 → v1.5.0: 5,523 lines in 0.83 days (6,688.8 lines/day) (v1.4.1...v1.)
- 3,376 lines of first-party code in ~4.0h (844 lines/hour, 1 commit session) (27568e5d8381)
AI provenance describes how code was produced; it is not a quality judgment. Unless attribution is explicit, these are signals consistent with AI generation, not proof. Squash/rebase workflows, imported code, and rewritten history reduce accuracy.
Code quality
Code quality is adequate: test-to-source ratio 1.26, CI runs tests; 32% of function code in complex or long functions; 2% duplicated lines. Weakest area: complexity.
| Area | Score |
|---|---|
| Complexity (lizard) | 39 |
| Duplication | 89 |
| Code smells (Opengrep) | 60 |
| Tests and CI | 90 |
| Documentation | 85 |
| Type safety | 100 |
| Process (Scorecard review/maintenance) | n/a |
- Functions: 1,308; mean complexity 3.4, 90th percentile 8; 42 complex and 5 long functions
- Duplicated lines: 2.0% of 7,119 compared
- Tests: 11,323 test lines for 9,008 source lines (ratio 1.26); CI test commands: npm test, npm run test; 72% of recent source commits also change tests
- Docs missing or thin: contributing
Most complex functions:
- _onKeyDown in src/component/element.ts: complexity 136, 155 lines
- _onLiveBeforeInput in src/browser/input.ts: complexity 66, 109 lines
- _restoreLiveSelection in src/browser/selection.ts: complexity 66, 200 lines
- _onLiveInput in src/browser/input.ts: complexity 54, 143 lines
- parseListItem in src/markdown/block-syntax.ts: complexity 36, 20 lines
Security
Security posture is weak: 19 high-severity SAST findings; 20 high-severity workflow issues. Weakest area: posture.
| Area | Score |
|---|---|
| Secrets (gitleaks, tree + history) | 97 |
| Static analysis (Opengrep) | 33 |
| Vulnerable dependencies (OSV) | 100 |
| CI workflows (zizmor) | 2 |
| Posture (policy, updates, signing, lockfiles) | 0 |
| OpenSSF Scorecard | n/a |
- Posture checks passed: lockfiles; missing: security policy, dependency updates, signed commits
Top findings
| Severity | Finding | Location |
|---|---|---|
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/browser/clipboard.ts:15 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a template.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/browser/clipboard.ts:15 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/browser/clipboard.ts:21 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a template.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/browser/clipboard.ts:21 |
| high | opengrep/javascript.express.security.injection.tainted-sql-string: Detected user input used to manually construct a SQL string. This is usually bad practice because manual construction could accidentally result in a SQL injection. An attacker could use a SQL injection to steal or modify contents of the database. Instead, use a parameterized query which is available [confidence medium] |
src/browser/completions.ts:83 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/component/element.ts:539 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._shadow.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/component/element.ts:539 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/component/element.ts:1856 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._completionPopup.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/component/element.ts:1856 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:126 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._preview.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:126 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:134 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._preview.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:134 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:211 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._liveEditor.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:211 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:265 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a template.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:265 |
| high | opengrep/javascript.browser.security.insecure-document-method: User controlled data in methods like innerHTML, outerHTML or document.write is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:525 |
| high | opengrep/javascript.browser.security.insecure-innerhtml: User controlled data in a this._liveEditor.innerHTML is an anti-pattern that can lead to XSS vulnerabilities [confidence low] |
src/render/live.ts:525 |
| high | zizmor/dangerous-triggers: use of fundamentally insecure workflow trigger [confidence medium] |
.github/workflows/commit-dist.yml:4 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/commit-dist.yml:23 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/commit-dist.yml:27 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/commit-dist.yml:31 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/fuzz.yml:24 |
| high | zizmor/unpinned-uses: unpinned action reference [confidence high] |
.github/workflows/fuzz.yml:29 |
Static signals only: the scorer never runs the project's code. Secret findings are pattern matches that were not verified, and secret values are never stored.
Distribution signals
- readme-download-lure: gives an archive password
Signals consistent with a repository that exists to distribute a download. They are heuristics, not a verdict; release files were not downloaded or inspected.
Repository profile
- Source lines: 9,008; test lines: 11,323
| Language | Lines |
|---|---|
| JavaScript | 12,397 |
| TypeScript | 7,934 |