Skip to content

1.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 01 Sep 20:01
· 86 commits to develop since this release
1.0.0

추가

  • Format streaming import reader parity: CSV, Jackson2/3 NDJSON, GraphML,
    OkIO에 순차 GraphRecordFlowReader를 추가하고 source ownership, cancellation,
    safe parse failure, bounded edge staging 계약을 포맷 간에 정렬했다
    (#313).
  • graph-io 모든 실행 모델에 ordered progress listener lifecycle과 phase별 상태
    요약을 추가하고, 선택적 graph-io-micrometer bridge 및 Spring Boot
    조건부 자동설정을 제공한다 (#311).
  • Virtual Thread 벌크 I/O future가 cancel(false) 상태 취소와
    cancel(true) worker interrupt를 구분하고, Micrometer tag cardinality를
    고정한다.
  • Backend-native bulk loader SPI: graph-io-core에 raw R/validated V
    source 경계, capability·progress·report 계약, bounded cancellation/cleanup,
    secret-free lifecycle diagnostic을 추가했다 (#312). 실제 backend adapter와
    URI/file I/O는 후속 이슈 범위다.

변경

  • Bluetape4k 2.0.0 stable catalog 전환: 공개 검증이 끝난 Projects 2.0.0을
    포함하는 bluetape4k-dependencies commit
    791288630092ab17d23ba106c93c1f615b13f02a를 build와 CI의 immutable catalog
    source로 고정했다.

  • Release Testcontainers 중복 제거: exact tag SHA의 성공한 Full Nightly에서
    image family gate와 전체 Nightly 상태를 확인하고, release workflow에서는 동일한
    네 graph container workload를 다시 실행하지 않도록 단순화했다. Stable release의
    catalog 기본값도 repository variable이 아니라 tag에 checked-in 된 immutable SHA로
    고정하고, manual dispatch의 명시적 catalogRef만 override로 허용한다
    (#600).

  • AGE SQL 구조적 식별자 경계: graph·label·column 식별자를 공통
    requireSafeIdentifier로 검증하고, dollar-quote 본문 충돌과 property 값
    직렬화 경계를 회귀 테스트로 고정했다 (#534).

  • TinkerGraph malformed ID 계약: numeric ID로 변환할 수 없는 입력은
    GraphQueryException으로 조기에 거부하고, valid-but-missing ID의 기존
    null/false/empty 결과는 유지했다. weighted-path 테스트의 JVM bare assert
    bluetape4k-assertions matcher로 교체했다
    (#543).

  • Neo4j weighted-path assertion 정렬: weighted-path 회귀가 JVM assertion
    활성화 여부에 의존하지 않도록 bluetape4k-assertions를 사용했다
    (#544,
    PR #565).

  • Graph option Bluetape validation: traversal·algorithm option 생성과
    역직렬화에서 양수·0 허용 depth·유한 실수 invariant를 공통 Bluetape helper로
    검증하고 bluetape4k.assertions.assertFailsWith 회귀를 추가했다
    (#540,
    PR #592).

  • Spring Boot·examples lifecycle 계약: management 상태 요약과 AGE
    initializer의 예외 경계를 정렬하고, suspend example teardown은
    CancellationException을 재전파하며 owned driver close를 finally에서
    보장하도록 했다 (#545,
    #546).

  • Graph-io checkpoint/state lifecycle: 공통 checkpoint identity·phase·claim
    수명주기, atomic workflow update, report payload 보존, durable state-store TCK와
    job별 lock registry를 연결했다. transform·retry·failure 경계와 기존
    sources·elapsed·checkpoint 보존을 bluetape4k.assertions 기반 TCK로
    고정했다 (#537,
    #538,
    #553,
    #554,
    #555).

  • Graph-io bounded export lifecycle: CSV/GraphML export를 immutable spool
    replay로 정렬하고, backend bounded chunk capability와 stage 시점 기준 데이터를
    분리했다. capped payload direct write, constructor fail-clean, record 단위
    suspend cancellation checkpoint, primary/suppressed cleanup 경계를 추가했다
    (#539,
    #556,
    #557,
    #558).

  • Catalog·retry-only CI evidence: 중앙 catalog ownership을 사용하고
    examples/core retry 결과의 첫 실패·attempt count·success_after_retry
    별도 evidence로 보존하는 fail-closed 경계를 추가했다
    (#547,
    PR #568).

  • Virtual Thread split-package 검증 경계: upstream 지원 PR
    #1523
    bluetape4k-virtualthread-api 타입을 .api package로 이동하고 core owner를
    유지하도록 정렬했다. graph-core에는 실제 resolved JAR 쌍의 package ownership와
    java --validate-modules를 검증하는 fail-closed verifier 및 migration 문서를
    추가했다. upstream PR은 2026-08-26에 MERGED 되었고, 공개된 Bluetape4k 2.0.0
    artifact를 immutable release catalog로 소비한다
    (#563).

  • Virtual Thread helper owner 정리: graph-core의 graph-local
    CompletableFutureNullableSupportKt 중복을 제거하고 공식
    bluetape4k-corevirtualFutureOfNullable을 사용하도록 정렬했다. Kotlin
    source import는 유지하고 generated owner를 직접 참조한 consumer의 재컴파일
    경계, upstream split-package 후속 범위, Bluetape assertion ownership TCK를
    문서화했다 (#542).

  • Generated owner ABI migration TCK: 삭제된
    CompletableFutureNullableSupportKt를 직접 호출하는 최소 Java fixture의
    linkage failure와 공식 CompletableFutureSupportKt로 재컴파일한 nullable
    future 성공 경로를 격리된 classloader로 검증했다. classfile owner와
    ProtectionDomain.codeSource가 실제 bluetape4k-core artifact를 가리키는지
    확인해 source-level compile과 binary migration의 차이를 고정했다
    (#562).

  • Serializable option invariant TCK: graph-core의 Serializable traversal·algorithm
    options와 MissingWeightPolicy.UseDefault가 Java deserialization으로 constructor
    invariant를 우회하지 못하도록 readObject 재검증과 InvalidObjectException 계약을
    추가했다. public property, serialVersionUID = 1L, 정상 round-trip과 malformed
    payload 거부를 Bluetape assertion TCK로 고정했다 (#560).

  • Virtual Thread optional async surface: graph-core Virtual Thread facade에
    merge/schema/transaction/chunked read·export CompletableFuture 표면을 추가하고,
    capabilities()delegateCapabilities()를 실제 async surface와 borrowed
    delegate mapping으로 분리했다. Bluetape4k virtual future helper, transaction
    thread affinity, unsupported exceptional future, delegate·chunk source ownership,
    cancellation/timeout과 materialized chunk 경계를 TCK와 EN/KO 문서로 고정했다
    (#541,
    #561).

  • Weighted path maxDepth conformance: Dijkstra/A* JVM fallback이
    (vertexId, depth) 상태와 predecessor를 사용해 inclusive hop bound를
    적용하도록 고쳤다. maxDepth=0 source-only 경계와 cheaper-deep/shallow
    경로를 graph-core 및 Neo4j, Memgraph, AGE, FalkorDB, TinkerGraph의
    sync/suspend/virtual-thread 공통 TCK로 검증했다 (#559).

  • Catalog ownership and retry-only CI evidence: local bluetape4k version
    alias를 중앙 immutable bt4k catalog ownership으로 정리하고, examples
    build와 graph-core test의 bounded retry가 첫 실패 log·attempt count·
    success_after_retry를 별도 evidence로 보존하도록 공통 helper와 governance
    계약을 추가했다 (#547).

  • Bounded chunk capability contract: CHUNKED_READ/CHUNKED_EXPORT API
    chunking과 source bounded 실행을 BOUNDED_CHUNKED_READ/
    BOUNDED_CHUNKED_EXPORT로 분리하고, 실제 traversal bounded 보장을 증명한
    TinkerGraph만 marker와 capability를 광고하도록 정렬했다. AGE, Neo4j,
    Memgraph, FalkorDB synchronous fallback은 API chunking만 유지하며 GraphML과
    graph-core 문서에 heap-bound 한계를 명시했다
    (#536).

  • GraphCapability enum compatibility policy: 기존 enum ordinal과
    serialization name을 보존하고, 새 capability를 enum 마지막에만 추가하는
    규칙과 외부 exhaustive whenelse/unknown handling을 graph-core
    EN/KO README와 release guidance에 명시했다. 이름 기반 입력은
    fromSerializedNameOrNull로 future capability를 null로 격리한다
    (#549).

  • AGE suspend Flow streaming boundary: direct suspend 조회가
    Dispatchers.IO의 JDBC cursor와 channel backpressure를 사용하고,
    DatabaseConfig.defaultFetchSize 또는 양수 기본값 100을 적용하도록 정렬했다.
    이미 방출한 prefix가 늦은 JDBC 오류에서 중복되지 않도록 streaming transaction의
    재시도를 끄고(maxAttempts=1), 취소·collector 예외 시 cursor와 transaction을
    닫는 계약을 검증했다
    (#535).

  • AGE streaming fetch/retry fault injection: 실제 AGE JDBC 경계를 감싼
    test-only proxy로 configured fetch size 8, positive fallback 100, late
    SQLException, emitted prefix 1건과 streaming attempt 1회를 관찰하는 회귀를
    추가했다. production API는 변경하지 않고 #552의 driver stall 취소 범위는
    별도 유지한다 (#550).

  • suspendTransaction 중첩 Flow 결과 계약: graph-core 공통 helper가
    transaction commit 전에 최상위 Flow를 materialize하고, Pair, Triple,
    Map, Collection, 배열 내부의 중첩 FlowIllegalArgumentException으로
    거부하도록 AGE·Neo4j·Memgraph·TinkerPop에 정렬했다. 중첩 값을 반환해야 하는
    호출자는 transaction block 안에서 toList() 등으로 명시적으로 materialize해야
    하며, 임의 사용자 wrapper의 내부 구조는 검사하지 않는다
    (#551).

  • AGE JDBC statement 취소 수명주기: direct suspend Flow가 취소되면 active
    JDBC statement에 Statement.cancel()을 최대 한 번 전달하고, Exposed cleanup이
    statement와 ResultSet을 닫도록 정렬했다. executeQuery()
    ResultSet.next() blocking 경계를 실제 AGE JDBC proxy로 검증하며, driver가
    statement 취소를 지원하지 않는 경우에는 자체 timeout/vendor API가 필요하다는
    제한을 문서화했다 (#552).

  • Graph image/document contract alignment: 공용 graph launcher와 현재
    중앙 catalog에 맞춰 Neo4j 5.26.29, Memgraph 3.12.0, Apache AGE
    release_PG18_1.7.0, FalkorDB v4.20.2 및 Java 25/Kotlin 2.4.10 기준을
    루트·backend EN/KO README, AGE 선택 가이드, FalkorDB manual/KDoc에 정렬하고,
    manifest/image family drift를 fail-closed로 검증했다
    (#527).

  • Spring Testcontainers DynamicPropertyRegistry bridge: 선택적
    bluetape4k-testcontainers-spring을 graph-spring-boot 테스트에 연결하고,
    공용 testcontainers.* key와 기존 bluetape4k.graph.* 설정 alias의 lazy 계약을
    FalkorDB live 통합 테스트 및 backend mapping 회귀 테스트로 고정했다
    (#525).

  • Graph Testcontainers image family gate: Neo4j, Memgraph, Apache AGE,
    FalkorDB manifest가 변경 범위를 결정하고, 각 backend의 startup readiness와
    대표 GraphCapability workload를 순차 실행하도록 CI·Nightly·release gate를
    연결했다. readiness timeout, image pull/rate-limit, infrastructure,
    application failure를 분류하고 retry 성공도 release gate를 열지 않으며,
    image digest·container inspect/logs/events를 artifact로 보존한다
    (#526).

버그 수정

  • Weighted shortest-path benchmark depth: vertexCount=100 dataset의 99-hop
    canonical path를 탐색할 수 있도록 benchmark setup이 PathOptions.maxDepth
    dataset 깊이에 맞춰 구성한다
    (#603).
  • TinkerGraph chunk cursor lifecycle: sync vertex/edge chunk 경로에
    close-aware cursor를 추가하고 suspend Flow가 조기 take, cancellation,
    iterator 예외에서 traversal을 닫도록 정렬했다. 기존 repository Sequence
    ABI는 유지하며 graph-io와 remote driver backend는 변경하지 않았다
    (#548).
  • Suspend example teardown cancellation contract: code, fraud, IAM,
    knowledge, LinkedIn, observability, recommendation 예제의 suspend backend
    teardown이 CancellationException을 재전파하고 일반 graph drop 실패만
    기록하도록 정렬했다. owned driver close는 finally에서 보장하며 sync-only
    teardown은 변경하지 않았다 (#546).
  • Spring Boot graph management contract: Actuator 상태 요약이 backend별
    graph/database 설정과 실제 GraphOperations.capabilities()·graph-io
    classpath/bean 상태를 반영하도록 고쳤다. AGE graph initializer는
    operations의 typed duplicate predicate에만 중복을 위임하고 일반 예외를
    다시 던지며, backend auto-configuration 테스트는
    bluetape4k.assertions.assertFailsWith를 사용한다
    (#545).
  • Graph cache create contract: AGE, Neo4j, Memgraph 캐시 데코레이터가
    createVertexcreateEdge를 동일 인자라는 이유로 합치지 않고 매번 backend에
    위임하도록 고쳤다. 생성 후 읽기 캐시 무효화와 영문/국문 문서 계약도 정렬했다
    (#463).
  • Graph cache bounds and TTL: AGE, Neo4j, Memgraph 캐시 데코레이터가
    maxSizeexpireAfterWrite를 모든 읽기 캐시에 실제로 적용하도록 Caffeine
    bounded/expiring cache로 전환했다. 양수 파라미터 검증과 eviction/expiration
    회귀 테스트, 영문/국문 문서를 추가했다
    (#464).
  • Graph cache invalidation race: AGE, Neo4j, Memgraph 캐시 데코레이터가
    generation guard로 동시 cache miss의 stale 재적재를 차단하고, dropGraph
    transaction commit/rollback 이후의 읽기 캐시 경계를 명시하도록 정렬했다
    (#499).
  • Virtual Thread bulk adapter lifecycle: graph-io의 wrapImporter
    wrapExporter가 동기 delegate의 close()를 wrapper에서 최대 한 번 전파하고,
    반복 close·source/sink 소유권·비동기 작업 중 close 정책을 KDoc과 회귀 테스트로
    명시하도록 고쳤다 (#470).

Contributors

Thanks to everyone who contributed to this release.

Full Changelog: v0.3.0...1.0.0