RepoPilot

apache/fesod

Fast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM.

Healthy

Healthy across the board

HealthyDependency

Permissive license, no critical CVEs, actively maintained — safe to depend on.

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Scorecard: default branch unprotected (0/10)
  • Last commit 2d ago
  • 14 active contributors
  • Distributed ownership (top contributor 24% of recent commits)
  • Apache-2.0 licensed
  • CI configured
  • Tests present

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests, cross-checked against OpenSSF Scorecard

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Want this for your own repo?

Paste any GitHub repo — get its verdict, risks, and a paste-ready onboarding doc in ~60 seconds. Free, no sign-up.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/apache/fesod)](https://repopilot.app/r/apache/fesod)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/apache/fesod on X, Slack, or LinkedIn.

Ask AI about apache/fesod

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: apache/fesod

Generated by RepoPilot · 2026-06-27 · Source

🎯Verdict

GO — Healthy across the board

  • Last commit 2d ago
  • 14 active contributors
  • Distributed ownership (top contributor 24% of recent commits)
  • Apache-2.0 licensed
  • CI configured
  • Tests present
  • ⚠ Scorecard: default branch unprotected (0/10)

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests, cross-checked against OpenSSF Scorecard</sub>

TL;DR

Fesod (Apache Fesod) is a Java-based spreadsheet processing library designed to handle large Excel files without triggering out-of-memory errors. It uses stream-based reading and efficient memory management (evidenced by SparseBitSet in dependencies) to process XLSX/CSV files that would normally exhaust heap. The core is built on Apache POI but optimized for memory-constrained environments. Modular monorepo structure: fesod-bom provides dependency management, fesod-common holds shared utilities (2,204 KB Java codebase), fesod-sheet is the main spreadsheet engine (inferred from pom.xml references). GitHub Actions workflows in .github/workflows orchestrate CI, nightly tests, security scanning (CodeQL), license compliance, and doc deployment. Distribution includes pre-built licenses in dist/licenses/.

👥Who it's for

Backend Java developers and data engineers who need to ingest, process, or transform large spreadsheets (500MB+) in production systems without allocating massive heap memory. Common use cases: ETL pipelines, bulk data imports, financial reconciliation systems, and cloud environments with memory constraints.

🌱Maturity & risk

Production-ready and actively maintained. This is an Apache Software Foundation incubating project with CI/CD pipelines (ci.yml, nightly.yml, codeql-scan.yml), Maven Central distribution, and structured governance (CONTRIBUTING.md, DISCLAIMER, LICENSE). Presence of comprehensive workflows and BOM (Bill of Materials) packaging indicates mature release process.

Low to moderate risk: 42 transitive dependencies (commons-codec, commons-compress, poi-ooxml, xmlbeans, etc.) create a moderate supply-chain surface. Apache project governance mitigates breaking-change risk. Monitor the nightly.yml workflow results and fuzz-tests.yml for stability issues. Single-maintainer risk is reduced by Apache oversight, but adoption rate appears smaller than POI itself.

Active areas of work

Active development with automated quality gates: the repo runs nightly test suites (nightly.yml), CodeQL security scanning (codeql-scan.yml), license compliance checks (license-check.yml), and fuzzing (fuzz-tests.yml). Stale issue auto-close is configured (issue-close-stale.yml), suggesting active triage. Documentation is auto-deployed (deploy-docs.yml, preview-docs.yml), pointing to ongoing user-facing improvements.

🚀Get running

git clone https://github.com/apache/fesod && cd fesod && ./mvnw clean install (Maven Wrapper configured in .mvn/wrapper/). Then explore fesod-sheet module's tests to see usage examples. Read CONTRIBUTING.md and README.md for project conventions and feature overview.

Daily commands: For building: ./mvnw clean package (Maven). For testing: ./mvnw test. For documentation: invoke the ci-docs.yml workflow or check https://fesod.apache.org. No dev server in traditional sense; this is a library. Import fesod-sheet into your Maven project and call the API directly.

🗺️Map of the codebase

  • pom.xml — Root Maven configuration defining the multi-module project structure, BOM dependencies, and build lifecycle for the fesod spreadsheet processing framework.
  • fesod-common/src/main/java/org/apache/fesod/common/util — Core utility library providing string, list, map, and validation helpers that underpin all spreadsheet operations across modules.
  • fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples — Primary entry point examples demonstrating read/write workflows, custom converters, and large-file handling patterns essential for understanding the API.
  • .github/workflows/ci.yml — Continuous integration pipeline enforcing test coverage, code quality, and Apache license compliance on every commit.
  • CONTRIBUTING.md — Guidelines for contributors covering branch strategy, commit conventions, and PR submission process for the Apache project.
  • README.md — Primary documentation introducing fesod's OOM-safe spreadsheet processing model, quick-start examples, and feature overview.
  • fesod-bom/pom.xml — Bill of Materials managing transitive dependencies (POI, commons libraries, etc.) across all fesod modules to ensure version consistency.

🧩Components & responsibilities

  • fesod-common (Utilities) (Java, Apache Commons) — Provides reusable helpers (StringUtils, ListUtils, IoUtils, ValidateUtils) for string, list, and I/O operations.
    • Failure mode: Null pointer or invalid input silently ignored; downstream code may fail or produce incorrect results.
  • Converter Engine (Java generics, reflection (optional)) — Transforms raw cell values to domain objects using user-provided or built-in converters.
    • Failure mode: Conversion error on unsupported type; exception or fallback (null/empty) depending on configuration.
  • POI Integration Layer (Apache POI, Java NIO) — Wraps Apache POI streaming APIs to read/write rows in chunked fashion, avoiding full file load.
    • Failure mode: File format corruption or incomplete write if streams not flushed/closed; OOM if row batch too large.
  • Example & Documentation (Java, Markdown) — Demonstrates quick-start (simple read/write) and advanced (custom converters, large files) usage patterns.
    • Failure mode: Outdated or missing examples confuse new users; poor documentation leads to misuse.
  • CI/CD Pipeline (GitHub Actions, Maven, CodeQL) — Runs tests, validates licenses, scans for security issues, and generates documentation on each commit.
    • Failure mode: Broken build or licensing violation blocks merges; security issues undetected in production.

🔀Data flow

  • User applicationFesod Read API — User opens a spreadsheet file (XLS, XLSX, CSV) via simple or fluent API.
  • Fesod Read APIPOI streaming reader — Framework requests next row batch from POI, which reads fixed chunk from disk.
  • POI streaming readerConverter engine — Raw cell values (strings, numbers) are passed to pluggable converters for type transformation.
  • Converter engineUser domain objects — Typed objects (e.g., List<MyClass>) returned to user callback or collection.
  • User domain objectsFesod Write API — User passes transformed or new data to write API, which streams rows back to disk.

🛠️How to make changes

Add a new custom data type converter

  1. Create a new class extending the framework's Converter interface in a new file under fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/converter/ (fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/converter/CustomStringStringConverter.java)
  2. Implement the convert method to transform cell values to your custom type (fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/CustomConverterExample.java)
  3. Register the converter in your read/write configuration and test against fesod-common/src/test/java utility tests (fesod-common/src/test/java/org/apache/fesod/common/util/MemberUtilsTest.java)

Process a large spreadsheet file without OOM

  1. Reference the LargeFileWriteExample pattern which uses chunked/streaming APIs (fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/LargeFileWriteExample.java)
  2. Ensure your data source implements row iteration (not full load) and use IoUtils for resource cleanup (fesod-common/src/main/java/org/apache/fesod/common/util/IoUtils.java)
  3. Configure memory limits in your Maven build (fesod-bom/pom.xml) and test with fuzz-tests workflow (.github/workflows/fuzz-tests.yml)

Add a new utility module to fesod-common

  1. Create a new class (e.g., DateUtils.java) in fesod-common/src/main/java/org/apache/fesod/common/util/ (fesod-common/src/main/java/org/apache/fesod/common/util/StringUtils.java)
  2. Write corresponding unit tests in fesod-common/src/test/java/org/apache/fesod/common/util/ (fesod-common/src/test/java/org/apache/fesod/common/util/StringUtilsTest.java)
  3. Run local Maven build and CI workflow (ci.yml) to verify test coverage and Apache license headers (.github/workflows/ci.yml)

🔧Why these technologies

  • Apache POI — Industry-standard library for reading and writing Excel/spreadsheet formats with XLS, XLSX, CSV support.
  • Maven multi-module — Enables separation of concerns (common utilities, examples, BOM) while maintaining consistent versions and Apache licensing.
  • Java generics & converter pattern — Type-safe transformation of cell data to domain objects without tight coupling to specific types.
  • Commons libraries (codec, io, csv, compress) — Proven, lightweight utilities for encoding, compression, and structured data handling.

⚖️Trade-offs already made

  • Streaming/chunked row processing instead of full file loading

    • Why: Prevents OutOfMemoryError on large files, core value proposition of fesod.
    • Consequence: Slightly higher code complexity; users must implement iterable data sources rather than passing lists.
  • Converter-based type transformation instead of reflection-only mapping

    • Why: Explicit converters allow custom domain logic and better performance control.
    • Consequence: More boilerplate for users; requires writing custom Converter implementations for non-standard types.
  • Multi-module Maven structure (fesod-common, examples, BOM)

    • Why: Allows independent versioning, easier onboarding with examples, cleaner BOM management.
    • Consequence: More complex build setup; contributors must understand module interdependencies.

🚫Non-goals (don't propose these)

  • Real-time collaborative editing or multi-user synchronization
  • Built-in database persistence or ORM integration
  • GUI/visual editor for spreadsheets
  • Automatic formula evaluation or complex cell formulas
  • Non-JVM language bindings (Python, JavaScript, etc.)

📊Code metrics

  • Avg cyclomatic complexity: ~6 — Moderate complexity: streaming data flow, generic type handling, and POI integration require careful state management; utility layers are straightforward.
  • Largest file: fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/LargeFileWriteExample.java (150 lines)
  • Estimated quality issues: ~8 — Potential null-safety and resource-leak issues in streaming code; limited error handling documentation; test coverage appears solid but integration tests for edge cases (corrupted files, network I/O) are not evident from file list.

⚠️Anti-patterns to avoid

  • Null pointer dereference in utility methods (Medium)fesod-common/src/main/java/org/apache/fesod/common/util/*.java: Many utility methods (StringUtils, ListUtils) accept nullable parameters but do not consistently validate before use, risking NPE in downstream code.
  • Resource leak in POI integration (High)fesod-examples (inferred from LargeFileWriteExample pattern): If user callback throws exception, file streams may not be closed; IoUtils cleanup is not guaranteed in all error paths.
  • Silent conversion failures (Medium)fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples/advanced/CustomConverterExample.java: Custom converters that fail silently (return null/default) instead of throwing exceptions hide data quality issues.

🔥Performance hotspots

  • POI file parsing (LargeFileWriteExample pattern) (Computation) — Parsing large XLSX files with complex formulas or formatting is CPU-bound; row batch size tuning is critical.
  • Converter engine type matching (reflection-based or registry lookup) (Lookup/Cache) — Looking up converters for each cell value could be slow if done per-cell rather than per-row or cached.
  • Disk I/O flushing in write operations (I/O) — Frequent fsync calls or unbuffered writes will degrade throughput; batch size and sync strategy must be configurable.

🪤Traps & gotchas

Maven Wrapper (.mvn/) is used instead of system Maven—run ./mvnw not mvn. Nightly builds (nightly.yml) may surface integration issues not caught by CI; check GitHub Actions tab before assuming code is stable. Large file testing requires adequate JVM heap (-Xmx); default IntelliJ settings may be insufficient for fuzz-tests.yml scenarios. License compliance check (license-check.yml) enforces ASF NOTICE/LICENSE headers; missing headers will cause CI failure. No explicit .env or config file needed for local dev, but fuzzing may require running in isolation to avoid CI resource limits.

🏗️Architecture

💡Concepts to learn

  • SAX-style (event-driven) parsing — Fesod's core memory efficiency comes from reading spreadsheet cells as a stream of events rather than loading the entire DOM tree; understanding SAX is critical to why Fesod doesn't OOM on 1GB files
  • Sparse matrix representation (SparseBitSet) — Spreadsheets with sparse data (many empty cells) use SparseBitSet to avoid allocating memory for every cell; this is why Fesod is efficient for real-world financial/analytical sheets
  • Zero-copy memory mapping — Fesod likely uses memory-mapped I/O for large file handling; understanding mmap and off-heap buffers is essential for advanced optimization
  • Streaming ZIP decompression — XLSX is a ZIP archive; naive extraction buffers the entire file in memory. Fesod streams individual entries, critical to the OOM solution
  • Heap pressure and GC tuning — Processing large files with Fesod still requires understanding JVM GC behavior; generation hypothesis, survivor space, and full GC triggers become visible when processing multi-GB spreadsheets
  • Bill of Materials (BOM) pattern — fesod-bom/ enforces consistent dependency versions across modules; essential for maintaining stability in a multi-module Maven project and for downstream consumers
  • apache/poi — Upstream dependency and predecessor; Fesod optimizes POI for streaming, so understanding POI's architecture is essential
  • alibaba/easyexcel — Chinese competitor solving the same large-file problem with similar stream-based approach; useful for cross-reference on design decisions
  • yhz61121/ExcelRead — Another streaming Excel reader; demonstrates alternative memory-efficient parsing patterns worth understanding
  • apache/commons-csv — Direct transitive dependency; understanding CSV handling in commons-csv informs how Fesod should wrap it
  • apache/commons-compress — Handles XLSX decompression internally; critical for streaming ZIP extraction without buffering entire archive

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for fesod-common utility classes

The fesod-common module contains 9 utility classes (BooleanUtils, IntUtils, IoUtils, ListUtils, MapUtils, MemberUtils, PositionUtils, StringUtils, ValidateUtils) but the test directory structure is incomplete. These utilities are foundational to the entire project and lack visible test coverage. Adding thorough unit tests would improve code reliability and serve as documentation for utility behavior.

  • [ ] Create test classes for each utility in fesod-common/src/test/java/org/apache/fesod/common/util/ (e.g., BooleanUtilsTest.java, IntUtilsTest.java, etc.)
  • [ ] Add test cases covering normal cases, edge cases, and null/empty inputs for each utility method
  • [ ] Verify test coverage reaches >80% for the fesod-common module using JaCoCo or similar
  • [ ] Reference these tests in any existing CI workflow (ci.yml) to ensure they run on each commit

Add integration tests for spreadsheet processing with large files

The project's core value proposition is 'Fast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM' but there's no visible fuzz-tests.yml integration or documented large-file stress tests. The fuzz-tests.yml workflow exists but likely needs implementation. Adding memory-efficient large file tests would validate the OOM-prevention claim.

  • [ ] Examine .github/workflows/fuzz-tests.yml and implement or enhance fuzz testing for the fesod-sheet module
  • [ ] Create integration tests in fesod-sheet that process progressively larger spreadsheets (1MB, 100MB, 1GB+) to verify memory efficiency
  • [ ] Add assertions to verify memory usage stays below defined thresholds during processing
  • [ ] Document test results and memory profile findings in a new doc like docs/performance-benchmarks.md

Create missing CONTRIBUTING.md guidelines and issue/PR templates with specific examples

While CONTRIBUTING.md exists, the .github/ISSUE_TEMPLATE directory has templates but no examples or specific guidance for spreadsheet-related issues. The repo has a skill challenge (fastexcel-to-fesod) suggesting onboarding complexity. Adding detailed contribution guidelines with concrete examples for common tasks would lower barriers for new contributors.

  • [ ] Enhance CONTRIBUTING.md with sections: 'Building Locally', 'Testing Your Changes', 'Submitting PRs for fesod-sheet vs fesod-common', and 'Performance Benchmarking'
  • [ ] Add example issue descriptions to .github/ISSUE_TEMPLATE/bug-report.yml showing common spreadsheet processing bugs (e.g., 'Large Excel file causes OOM when reading column X')
  • [ ] Create a docs/DEVELOPMENT.md file with setup instructions, Maven commands, and debugging tips specific to spreadsheet processing
  • [ ] Update .github/skills/fastexcel-to-fesod/SKILL.md with a step-by-step tutorial and link it from CONTRIBUTING.md

🌿Good first issues

  • Add streaming CSV reader comparable to XLSX reader in fesod-sheet; currently fesod-common likely has CSV parsing via commons-csv but no high-level wrapper—perfect entry point for understanding the abstraction layer
  • Expand documentation in README.md with concrete code examples for memory profiling (show heap usage before/after using Fesod vs raw POI); requires no core changes, helps future users validate claims
  • Write integration tests in fesod-sheet/src/test exercising the fuzzing scenarios from fuzz-tests.yml on known edge cases (corrupted cells, Unicode in large sheets, formula-heavy files); tests will reveal real crash vectors

Top contributors

Click to expand

📝Recent commits

Click to expand
  • fd57541 — [Test] Add testkit infrastructure and refactor unit tests with JUnit 5 parameterized patterns (#901) (GOODBOY008)
  • 5fb72f7 — docs: add blog for migration with OpenRewrite (#910) (bengbengbalabalabeng)
  • 6374a8c — fix: support SQL date types in WriteCellData (#912) (skytin1004)
  • 3bcdbdc — build: bump org.jacoco:jacoco-maven-plugin from 0.8.14 to 0.8.15 (#931) (dependabot[bot])
  • a9d1e8e — build: bump com.alibaba.fastjson2:fastjson2 from 2.0.61 to 2.0.62 (#909) (dependabot[bot])
  • ec02cc5 — docs(blog): add CVE-2026-49328 security advisory (#933) (bengbengbalabalabeng)
  • 4979089 — feat: support freeze pane via FreezePane or register WriteHandler on write (#916) (bengbengbalabalabeng)
  • 853acf4 — chore: merge 2.0.2-incubating into main branch (#930) (psxjoy)
  • 7fe23f0 — refactor: manage password handling in Excel processing (#928) (psxjoy)
  • 540a592 — docs: update download page for release 2.0.2-incubating (#922) (delei)

🔒Security observations

The Apache FESOD project demonstrates a reasonable security posture as an Apache Software Foundation project with proper licensing and CI/CD workflows (including CodeQL scanning). However, there are concerns around dependency management (incomplete POM configuration), XML parsing security (Apache POI vulnerability surface), and lack of explicit serialization security configurations. The project would benefit from completing the POM.xml configuration, establishing a formal vulnerability disclosure policy, and implementing comprehensive dependency vulnerability scanning in the CI/CD pipeline. No hardcoded credentials or obvious injection points were detected in the visible codebase structure.

  • Medium · Incomplete POM.xml Configuration — fesod-bom/pom.xml. The fesod-bom/pom.xml file appears to be truncated or incomplete. The build plugins section is cut off mid-configuration (<plugin><groupId>org.codehaus.mojo</groupId> with no closing tags), which could indicate missing security plugin configurations such as dependency-check, OWASP plugins, or other security scanning tools. Fix: Complete the POM.xml configuration and ensure security scanning plugins are properly configured. Consider adding org.owasp:dependency-check-maven plugin for vulnerability scanning.
  • Medium · Apache POI Dependency Usage — fesod-bom/pom.xml, dist/licenses/LICENSE-poi*.txt. The project uses Apache POI (poi, poi-ooxml, poi-ooxml-lite) for spreadsheet processing. POI has a history of XXE (XML External Entity) vulnerabilities and other parsing issues when handling malicious or crafted spreadsheet files. Without explicit security configurations, this could be exploited. Fix: Ensure all POI dependencies are updated to the latest patched versions. Implement XML parsing security configurations to disable external entity processing. Consider adding input validation and file size limits for uploaded spreadsheets.
  • Low · Multiple Transitive Dependencies Without Explicit Versions — fesod-bom/pom.xml. The project depends on numerous Apache Commons libraries (commons-codec, commons-collections4, commons-compress, commons-csv, commons-io, commons-lang3, commons-math3) and other utilities (xmlbeans, cglib, asm). Without explicit version pinning in the BOM, transitive dependencies may introduce vulnerabilities. Fix: Explicitly define all direct and critical transitive dependency versions in the dependencyManagement section. Regularly scan for CVEs using tools like OWASP Dependency-Check or Snyk.
  • Low · No Security Policy or SECURITY.md File — Repository root. The repository structure shows standard Apache files (CONTRIBUTING.md, NOTICE, LICENSE) but no visible SECURITY.md file. This makes it unclear how to responsibly report security vulnerabilities. Fix: Create a SECURITY.md file documenting the vulnerability disclosure process and security contact information, following Apache Software Foundation guidelines.
  • Low · Serialization with EhCache — dist/licenses/LICENSE-ehcache.txt. The project includes ehcache dependency (dist/licenses/LICENSE-ehcache.txt). If used for caching user-controlled data without proper serialization filters, this could enable deserialization attacks. Fix: If EhCache is used, ensure serialization filters are configured to only allow safe classes. Validate that cached data is properly sanitized before deserialization.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/apache/fesod shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live apache/fesod repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/apache/fesod.

What it runs against: a local clone of apache/fesod — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in apache/fesod | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 32 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>apache/fesod</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of apache/fesod. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/apache/fesod.git
#   cd fesod
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of apache/fesod and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "apache/fesod(\\.git)?\\b" \\
  && ok "origin remote is apache/fesod" \\
  || miss "origin remote is not apache/fesod (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "pom.xml" \\
  && ok "pom.xml" \\
  || miss "missing critical file: pom.xml"
test -f "fesod-common/src/main/java/org/apache/fesod/common/util" \\
  && ok "fesod-common/src/main/java/org/apache/fesod/common/util" \\
  || miss "missing critical file: fesod-common/src/main/java/org/apache/fesod/common/util"
test -f "fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples" \\
  && ok "fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples" \\
  || miss "missing critical file: fesod-examples/fesod-sheet-examples/src/main/java/org/apache/fesod/sheet/examples"
test -f ".github/workflows/ci.yml" \\
  && ok ".github/workflows/ci.yml" \\
  || miss "missing critical file: .github/workflows/ci.yml"
test -f "CONTRIBUTING.md" \\
  && ok "CONTRIBUTING.md" \\
  || miss "missing critical file: CONTRIBUTING.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 32 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~2d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/apache/fesod"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/apache/fesod"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>